簡體   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