把 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