【问题标题】:Swift enum loses initialized values when set as a property?Swift枚举设置为属性时会丢失初始化值?
【发布时间】:2015-03-20 04:23:28
【问题描述】:

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

【问题讨论】:

标签: swift enums switch-statement


【解决方案1】:

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

【讨论】:

  • 啊,隐式展开的可选。没有在代码中检查它,但它是有道理的。谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-02-08
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多