Swift中有没有一种方法可以在不使用switch语句的情况下获得关联值



当我已经知道要获取的关联值的enum-case语句时,有没有比使用switch语句提取关联值更干净的方法?

必须想出一个switch语句,提供多个case,或者一个默认case来提取相关值,这太花哨了。

enum CircularReasoning {
case justPi(pi: Double)
case pizzaPie(howMany: Int)
}
var piInTheSky : Double 
let whatLogic = CircularReasoning(pi: 3.1415926)
⬇️ 𝘸𝘢𝘯𝘵 𝘵𝘰 𝘢𝘷𝘰𝘪𝘥 ⬇️ 
switch whatLogic {
case .justPi(let pi):
piInTheSky = pi!
default:
break
}

您可以像TylerP的示例中那样使用if case .<enum_case>(let value),或if case let .<enum_case>(value):

enum Foo {
case anInt(Int)
case aFloat(Float)
}
let aFoo: Foo = .anInt(9)
// Example of `if case .<enum_case)(let value)` syntax:
if case .anInt(let aValue) = aFoo {
print("aFoo = anInt((aValue))")
// Example of `if case let .enum_case(value)` syntax:
} else if case let .aFloat(aValue) = aFoo {
print("aFoo = aFloat((aValue))")
}

两者都有效。我不知道为什么这种语言同时包含这两种变体。

如果你只关心一种枚举类型,那么if语法中的任何一种对我来说都有意义。如果你处理的是多个可能的枚举值,那么开关版本似乎更干净。

这是对@DuncanC出色的投票结果和公认答案的改编,适用于我真实世界用例的虚构版本。

它说明了一种可能的方法,可以使用他的答案来减少提取相关值所需的空间,尤其是在有很多一次性案例的情况下。。。

注意:这并不意味着这是合适的或专业的快速造型;它显然很独特,但很紧凑。(我通常不会像这样把东西压缩成一行,除非它们变得非常重复/多余&产生很多毫无意义的垂直膨胀(

enum RealmKey { case realmOfRealms, anyOldRealm, someOtherRealm }
.
.
.
enum SymbolToken {
case realm       (key: RealmKey?)
case space       (key: SpaceKey?)
case area        (key: AreaKey?)
case region      (key: RegionKey?)
case preserve    (key: PeserveKey?)
case openParen
case closeParen
case logicalAnd
case logicalOr
case logicalNot

var realmKey    : RealmKey?    { if case .realm    (let key) = self { return key } else { return nil } }
var spaceKey    : SpaceKey?    { if case .space    (let key) = self { return key } else { return nil } }
var areaKey     : AreaKey?     { if case .area     (let key) = self { return key } else { return nil } }
var regionKey   : RegionKey?   { if case .region   (let key) = self { return key } else { return nil } }
var preserveKey : PreserveKey? { if case .preserve (let key) = self { return key } else { return nil } }
}
let realm = SymbolToken.realm(.realmOfRealms)
let realmKey = realm.realmKey

最新更新