[英]How to determine if undocumented value for NS_ENUM with Swift 1.2
例如,定义了以下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.
}
如何确定x是否在NS_ENUM上定义?
我认为这是Xcode 6.3发行说明中记录的 Swift 1.2中以下更改的结果:
现在可以使用
init(rawValue:)
初始值设定项从其原始整数值转换具有未记录值的导入的NS_ENUM类型,例如UIViewAnimationCurve
,而无需将其重置为nil
。 可以编写将unsafeBitCast
用作解决此问题的代码,以使用原始值初始化程序。 例如:let animationCurve = unsafeBitCast(userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue, UIViewAnimationCurve.self)
现在可以写成:
let animationCurve = UIViewAnimationCurve(rawValue: userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue)!
问题(如果我理解正确的话)是
typedef NS_ENUM(NSInteger, UIViewAnimationCurve) { ... }
仅定义了4个可能的枚举值,但实际上也可以采用其他(未记录的)值。 这使得一些讨厌的解决方法成为必要,请参见例如
为了解决这个问题, 如果枚举是从NS_ENUM
定义中导入的 ,Swift 1.2现在确实允许使用(原始整数类型的) 任意原始值创建枚举变量。
结果, 不可能以编程方式检查“原始值”是否为NS_ENUM
定义中定义的值之一。
尝试这个:
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
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.