当设置为属性时,Swift枚举失去初始值?

我找到了一个解决办法,但这个问题令我烦恼,我想我会分享以防其他人遇到同样的问题.很想知道为什么会这样.在下面的代码中,当它是一个局部变量时,我可以在类初始化程序期间打开枚举.我将枚举值存储到属性中.但是当我尝试在下面的示例中以不同的方法(名为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.

属性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不是零,:

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")
    }

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...