内容简介:把 swift 升级到 5.0 的时候相信大家一定会遇到建议添加如果 switch 语句中覆盖了枚举的每个 case,那么未来这个枚举如果增加了一个值,一定会对原来调用的代码造成 break change。如果是我们自己定义的枚举还好改,如果是系统级的库就会造成很大的影响。大概也是考虑到 swift 5.0 开始 ABI 稳定的承诺,引入如果在 switch 语句中使用了
把 swift 升级到 5.0 的时候相信大家一定会遇到建议添加 @unknown default 的警告:
@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 需要处理。
Frozen enum
有些枚举未来可能会变动,有些在声明的时候就很确定不会改变。这种状态 apple 称之为 frozen。枚举有两种可能:frozen(不变的)和 non-frozen(值会变的)。原来 OC 中的所有枚举默认都认为是 non-frozen 的。 如果想要把枚举声明为 non-frozen,使用 NS_CLOSED_ENUM 声明:
typedef NS_CLOSED_ENUM(NSInteger, NSComparisonResult) {
NSOrderedAscending = -1L,
NSOrderedSame,
NSOrderedDescending
};
复制代码
影响范围
目前 @unknown default 只针对 C 风格的 enum 和 Foundation 中的枚举起作用,用户在 swift 自定义的枚举都认为是 frozen 的。 我也不是很理解为什么这个枚举的类型区分只支持 OC,swift 不支持。这个特性如果被社区接受的话,猜测 swift 在未来版本也会支持用户自定义的 swift 枚举也可以标记为 non-frozen。
延伸阅读:
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Node 12 值得关注的新特性
- Node12有哪些值得关注的新特性?
- Node.js 12 值得关注的新特性
- 【译】2017年值得学习的 3 个 CSS 新特性
- Swift 5.0 值得关注的特性:增加 Result 枚举类型
- Java 11 发布线路图:有哪些值得期待的新特性?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
尽在双11:阿里巴巴技术演进与超越
阿里巴巴集团双11技术团队 / 电子工业出版社 / 2017-4 / 79
“双 11”,诞生于杭州,成长于阿里,风行于互联网,成就于新经济,贡献于全世界。 从 2009 年淘宝商城起,双 11 已历经八年。每年的双 11 既是当年的结束,又是走向未来的起点。技术的突破创新,商业模式的更替交互,推动着双 11 迈步向前。 《尽在双11——阿里巴巴技术演进与超越》是迄今唯一由阿里巴巴集团官方出品、全面阐述双 11 八年以来在技术和商业上演进和创新历程的书籍。内容......一起来看看 《尽在双11:阿里巴巴技术演进与超越》 这本书的介绍吧!