我找到了解决办法,但这个问题令我烦恼,我想我会分享,以防其他人遇到同样的问题。很想知道为什么会这样。在下面的代码中,当它是一个局部变量时,我可以在类初始化程序期间打开枚举。我将枚举值存储到属性中。但是当我尝试在下面的示例中以不同的方法(名为bar())打开存储的属性(名为foo)时 - 我收到编译器警告以及无法识别成员的错误。似乎知道foo是MyEnum类型,但不知道.ABC,.DEF和.GHI是成员。
enum MyEnum {
case ABC, DEF, GHI
}
class MyClass : NSObject {
var foo : MyEnum!
convenience init(foo: MyEnum) {
self.init()
self.foo = foo
switch foo {
case .ABC: println("ABC foo")
case .DEF: println("DEF foo")
case .GHI: println("GHI foo")
default: println("no foo")
}
}
func bar() {
switch foo {
case .ABC: println("ABC foo")
case .DEF: println("DEF foo")
case .GHI: println("GHI foo")
default: println("no foo")
}
}
}
解决方法是要么说:
switch foo as MyEnum { }
或在方法中声明一个局部变量,如
let x : MyEnum = foo
switch x { }
再一次,很高兴我找到了解决方法,但是肯定想知道这是否是预期的行为或是否需要向Apple提交雷达。这是Xcode 6.2,BTW。
答案 0 :(得分:4)
属性foo
不是MyEnum
,而是ImplicitlyUnwrappedOptional<MyEnum>
又名MyEnum!
。与许多其他情况不同,switch
不会隐式解开它。
您必须手动打开它:
if let foo = foo {
switch foo {
case .ABC: println("ABC foo")
case .DEF: println("DEF foo")
case .GHI: println("GHI foo")
default: println("no foo")
}
}
else {
println("nil foo")
}
如果您确定!
不是foo
,请强行打开nil
,
switch foo! {
case .ABC: println("ABC foo")
case .DEF: println("DEF foo")
case .GHI: println("GHI foo")
default: println("no foo")
}
或者与ImplicitlyUnwrappedOptional<Enum>
匹配:
switch foo {
case .Some(.ABC): println("ABC foo")
case .Some(.DEF): println("DEF foo")
case .Some(.GHI): println("GHI foo")
default: println("no foo")
}