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

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

内容简介:把 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算法

Haralambos Marmanis、Dmitry Babenko / 阿稳、陈钢 / 电子工业出版社 / 2011-11 / 65.00元

本书涵盖了五类重要的智能算法:搜索、推荐、聚类、分类和分类器组合,并结合具体的案例讨论了它们在Web应用中的角色及要注意的问题。除了第1章的概要性介绍以及第7章对所有技术的整合应用外,第2~6章以代码示例的形式分别对这五类算法进行了介绍。 本书面向的是广大普通读者,特别是对算法感兴趣的工程师与学生,所以对于读者的知识背景并没有过多的要求。本书中的例子和思想应用广泛,所以对于希望从业务角度更好......一起来看看 《智能Web算法》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码