把 swift 升級到 5.0 的時候相信你們必定會遇到建議添加 @unknown default
的警告: git
@unknown default
解決的兩個問題若是 switch 語句中覆蓋了枚舉的每一個 case,那麼將來這個枚舉若是增長了一個值,必定會對原來調用的代碼形成 break change。若是是咱們本身定義的枚舉還好改,若是是系統級的庫就會形成很大的影響。大概也是考慮到 swift 5.0 開始 ABI 穩定的承諾,引入 @unknown default
對將來枚舉的擴展新值時保證兼容性提供了很好的支持。程序員
若是在 switch 語句中使用了 default
,若是將來新增了枚舉值也不會破壞到調用代碼的編譯。可是用戶會很難發現有新的枚舉選項產生了。Apple 舉了一個 UIKeyboardType
的例子,這已是一個很是早期就存在的枚舉,可是在 iOS 10 中仍是新增了 asciiCapableNumberPad
了這個選項。iOS 每一個版本升級底層都會增長了一些功能,使用@unknown default
標記在 switch 語句中,若是有新的枚舉值編譯器就能夠很好的提示用戶有新的 case 須要處理。github
有些枚舉將來可能會變更,有些在聲明的時候就很肯定不會改變。這種狀態 apple 稱之爲 frozen。枚舉有兩種可能:frozen(不變的)和 non-frozen(值會變的)。原來 OC 中的全部枚舉默認都認爲是 non-frozen 的。 若是想要把枚舉聲明爲 non-frozen,使用 NS_CLOSED_ENUM
聲明:swift
typedef NS_CLOSED_ENUM(NSInteger, NSComparisonResult) {
NSOrderedAscending = -1L,
NSOrderedSame,
NSOrderedDescending
};
複製代碼
目前 @unknown default
只針對 C 風格的 enum 和 Foundation 中的枚舉起做用,用戶在 swift 自定義的枚舉都認爲是 frozen 的。 我也不是很理解爲何這個枚舉的類型區分只支持 OC,swift 不支持。這個特性若是被社區接受的話,猜想 swift 在將來版本也會支持用戶自定義的 swift 枚舉也能夠標記爲 non-frozen。app
延伸閱讀:ui