当我已经知道要获取的关联值的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