繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM