如何使用Swift 1.2确定NS_ENUM的未记录值

时间:2015-04-10 20:28:50

标签: objective-c swift enums

例如,定义了NS_Enum ......

typedef NS_ENUM(NSInteger, Type) {
  TypeNone = 0,
  TypeA = 1,
}
var x = 2
if let type: Type = Type(rawValue: x) {
  // Swift 1.2 executes this block.
}
else {
  // Previous swift executes this block.
}

如何确定是否在NS_ENUM上定义了x?

2 个答案:

答案 0 :(得分:3)

假设这是Swift 1.2中的以下更改的结果,记录在中 Xcode 6.3 release notes

  

导入带有未记录值的NS_ENUM类型,例如   UIViewAnimationCurve,现在可以从原始整数转换   使用init(rawValue:)初始化程序而不重置的值   nil。使用unsafeBitCast作为此问题的解决方法的代码可以   写入使用原始值初始化程序。例如:

let animationCurve =  
     unsafeBitCast(userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue,
     UIViewAnimationCurve.self)
     

现在可以改为:

let animationCurve = UIViewAnimationCurve(rawValue:  
    userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue)!

问题(如果我理解正确的话)是那个

typedef NS_ENUM(NSInteger, UIViewAnimationCurve) { ... }

仅定义了4个可能的枚举值,但实际上可以采用其他值 (未记录的)值。这需要一些讨厌的变通方法,例如参见

要解决这个问题,Swift 1.2现在允许创建 具有任意原始值的枚举变量(底层证据) 整数类型),如果从NS_ENUM导入枚举 定义

因此,不可能以编程方式检查是否 a"原始值"是NS_ENUM定义中定义的值之一。

答案 1 :(得分:0)

试试这个:

typedef NS_ENUM(NSInteger, Type) {
    TypeZero = 0,
    TypeOne = 1,
    TypeTwo = 2,
    TypeUnexpected = INT_MAX
};
switch Type(rawValue: 3) ?? .unexpected {
case .zero:
    // Handle type zero
    ...
case .one:
    // Handle type one
    ...
case .two:
    // Handle type two
    ...
default:
    // Handle unexpected types
    ...
}