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

栏目: Swift · 发布时间: 6年前

内容简介:把 swift 升级到 5.0 的时候相信大家一定会遇到建议添加如果 switch 语句中覆盖了枚举的每个 case,那么未来这个枚举如果增加了一个值,一定会对原来调用的代码造成 break change。如果是我们自己定义的枚举还好改,如果是系统级的库就会造成很大的影响。大概也是考虑到 swift 5.0 开始 ABI 稳定的承诺,引入如果在 switch 语句中使用了

把 swift 升级到 5.0 的时候相信大家一定会遇到建议添加 @unknown default 的警告:

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

@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。

延伸阅读:


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web开发敏捷之道

Web开发敏捷之道

Sam Ruby、Dave Thomas、David Heineme Hansson / 慕尼黑Isar工作组、骆古道 / 机械工业出版社 / 2012-3-15 / 59.00元

本书第1版曾荣获Jolt大奖“最佳技术图书”奖。在前3版的内容架构基础上,第4版增加了关于Rails中新特性和最佳实践的内容。本书从逐步创建一个真正的应用程序开始,然后介绍Rails的内置功能。全书分为3部分,第一部分介绍Rails的安装、应用程序验证、Rails框架的体系结构,以及Ruby语言的知识;第二部分用迭代方式创建应用程序,然后依据敏捷开发模式搭建测试案例,最终用Capistrano完成......一起来看看 《Web开发敏捷之道》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具