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

前端之家收集整理的这篇文章主要介绍了当设置为属性时,Swift枚举失去初始值?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我找到了一个解决办法,但这个问题令我烦恼,我想我会分享以防其他人遇到同样的问题.很想知道为什么会这样.在下面的代码中,当它是一个局部变量时,我可以在类初始化程序期间打开枚举.我将枚举值存储到属性中.但是当我尝试在下面的示例中以不同的方法(名为bar())打开存储的属性(名为foo)时 – 我收到编译器警告以及无法识别成员的错误.似乎知道foo是MyEnum类型,但不知道.ABC,.DEF和.GHI是成员.
  1. enum MyEnum {
  2. case ABC,DEF,GHI
  3. }
  4.  
  5. class MyClass : NSObject {
  6.  
  7. var foo : MyEnum!
  8.  
  9. convenience init(foo: MyEnum) {
  10.  
  11. self.init()
  12.  
  13. self.foo = foo
  14.  
  15. switch foo {
  16.  
  17. case .ABC: println("ABC foo")
  18. case .DEF: println("DEF foo")
  19. case .GHI: println("GHI foo")
  20. default: println("no foo")
  21.  
  22. }
  23. }
  24.  
  25. func bar() {
  26.  
  27. switch foo {
  28.  
  29. case .ABC: println("ABC foo")
  30. case .DEF: println("DEF foo")
  31. case .GHI: println("GHI foo")
  32. default: println("no foo")
  33.  
  34. }
  35. }
  36. }

解决方法是要么说:

  1. switch foo as MyEnum { }

或者在方法中声明一个局部变量

  1. let x : MyEnum = foo
  2.  
  3. switch x { }

再次,很高兴我找到了一个解决方法,但是肯定想知道这是否是预期的行为或是否需要向Apple提交雷达.这是Xcode 6.2,BTW.

属性foo不是MyEnum,而是ImplicitlyUnwrappedOptional< MyEnum>又名MyEnum!与许多其他情况不同,switch不会隐式解包它.

你必须手动打开它:

  1. if let foo = foo {
  2. switch foo {
  3. case .ABC: println("ABC foo")
  4. case .DEF: println("DEF foo")
  5. case .GHI: println("GHI foo")
  6. default: println("no foo")
  7. }
  8. }
  9. else {
  10. println("nil foo")
  11. }

或用力打开!如果你确定foo不是零,:

  1. switch foo! {
  2. case .ABC: println("ABC foo")
  3. case .DEF: println("DEF foo")
  4. case .GHI: println("GHI foo")
  5. default: println("no foo")
  6. }

或与ImplicitlyUnwrappedOptional< Enum>匹配原样:

  1. switch foo {
  2. case .Some(.ABC): println("ABC foo")
  3. case .Some(.DEF): println("DEF foo")
  4. case .Some(.GHI): println("GHI foo")
  5. default: println("no foo")
  6. }

猜你在找的Swift相关文章