例如,定义了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?
答案 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
...
}