Swift 5.0 值得关注的特性:Handle unknown values using "@unknown default"

把 swift 升级到 5.0 的时候相信你们必定会遇到建议添加 @unknown default 的警告: git

@unknown default 解决的两个问题

将来增长新的 case 后不会影响原有代码的编译

若是 switch 语句中覆盖了枚举的每一个 case,那么将来这个枚举若是增长了一个值,必定会对原来调用的代码形成 break change。若是是咱们本身定义的枚举还好改,若是是系统级的库就会形成很大的影响。大概也是考虑到 swift 5.0 开始 ABI 稳定的承诺,引入 @unknown default 对将来枚举的扩展新值时保证兼容性提供了很好的支持。程序员

在有新的枚举值时编译器能够提醒

若是在 switch 语句中使用了 default,若是将来新增了枚举值也不会破坏到调用代码的编译。可是用户会很难发现有新的枚举选项产生了。Apple 举了一个 UIKeyboardType 的例子,这已是一个很是早期就存在的枚举,可是在 iOS 10 中仍是新增了 asciiCapableNumberPad了这个选项。iOS 每一个版本升级底层都会增长了一些功能,使用@unknown default 标记在 switch 语句中,若是有新的枚举值编译器就能够很好的提示用户有新的 case 须要处理。github

Frozen enum

有些枚举将来可能会变更,有些在声明的时候就很肯定不会改变。这种状态 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


相关文章
相关标签/搜索