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