2016-03-02 56 views
2

我有一個枚舉一個Objective-C文件等被定義:枚舉與NS_ENUM的rawValue初始化定義不會失敗

typedef NS_ENUM(NSInteger, State) { 
    State_ACTIVE = 0, 
    State_PENDING = 1, 
    State_CANCELED = 2 
}; 

在我的SWIFT代碼,如果我做let state = State(rawValue: 100),通常這應該返回nil,因爲這是一個失敗的初始化程序。但是,當enum被聲明爲(與NS_ENUM)時,初始化成功,並且沒有跡象表明這是一個無效的枚舉值。這是Xcode中的錯誤,還是按照預期工作?

+2

即意,比較http://stackoverflow.com/questions/29570133/how-to-determine-if-無證值換NS-枚舉與-迅速-1-2。 –

回答

1

這是打算的行爲。對於橋接到Swift的任何NS_ENUM,構造函數將永不返回nil

嘗試使用iOS SDK中的其他枚舉將橋接到Swift的意外值。他們都將返回非空,即使對於不是由枚舉定義的rawValue

UITableViewCellStyle(rawValue: 7) // "Optional(__C.UITableViewCellStyle)" 
UITableViewCellAccessoryType(rawValue: 9999) // "Optional(__C.UITableViewCellAccessoryType)" 

,或者與unsafeBitCast

unsafeBitCast(42, UITableViewCellEditingStyle.self) // "Optional(__C.UITableViewCellStyle)" 

馬丁 - [R人士指出,這是在 的記錄Xcode 6.3 release notes

進口NS_ENUM類型無證值,如 UIViewAnimationCurve,現在可以是轉換器具d從其原始整數 的值使用init(rawValue:)初始值設定項而未被重置爲 nil。使用unsafeBitCast作爲此問題的解決方法的代碼可以編寫爲 以使用原始值初始值設定項。例如:

let animationCurve = 
    unsafeBitCast(userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue, 
    UIViewAnimationCurve.self) 

現在可以改爲寫爲:

let animationCurve = UIViewAnimationCurve(rawValue: 
    userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue)! 
+0

這是記錄在任何地方?或者有沒有解釋我缺少的這種行爲? – Ned

+0

@Ned編輯了我的答案,指向Xcode發行說明,其中記錄了這些內容。 – JAL

+0

我也想看看[OptionSetType協議參考](https://developer.apple.com/library/tvos/documentation/Swift/Reference/Swift_OptionSetType_Protocol/index.html)。 – JAL