看新闻很累?看技术新闻更累?试试下载 InfoQ 手机客户端,每天上下班路上听新闻,有趣还有料!
Xcode 9.3 中的 Swift 4.1 带来了一些语言上的提升,包括Equatable
和Hashable
协议的自动实现和条件一致性等。
条件一致性
条件一致性即,泛型类型只有在其类型参数满足特定要求的时候才会遵循某个协议。例如,一个 Array
只有当它的元素也遵循Equatable
协议的时候,才能实现 Equatable 协议。这可以用下列声明表示。
extension Array: Equatable where Element: Equatable { static func ==(lhs: Array<element>, rhs: Array<element>) -> Bool { ... } } </element></element>
这弥补了 Swift 泛型上的缺陷,使得泛型适配器类型(例如,反映组合类型能力的泛型类型)完全成为可能。例如,在 Swift 3 中存在 4 种不同的处理“懒”项目的泛型类型:LazySequence
、LazyCollection
、LazyBidirectionalCollection
和LazyRandomAccessCollection
。其中每一种类型都重新实现或者继承了和组合类型相同的 API。使用条件一致性,某一种类型的 Sequence 可以声明遵循懒协议,而无需定义任何中间泛型类型。
Synthesized ==
and hashValue
Swift 4.1 编译器能够为那些声明遵循Equatable
和Hahable
协议的 structs 和 enums,生成 ==
和hashValue
方法的实现。以前,开发者必须自己实现那些方法,而那是一件非常繁琐的任务:在通常情况下,==
方法的实现必须比较 structs 或 unions 的每一个相应成员;而hashValue
方法必须设法保证返回一个唯一的字符串。在 Swift 4.1,开发者只需声明遵循那些协议,相关的方法就会自动生成,提供所有存储的分别符合Equatable
或Hashable
的属性或枚举值。
Swift 4.1 中的其它显著改变如下:
- 大多数集合库的索引类型现在符合
Hashable
,可以在 key-path 下标和哈希过的集合中使用:
let s = "Hashable" let p = \String.[s.startIndex] s[keyPath: p] // "H"
- 完全实现智能 KeyPaths 。KeyPath 现在支持下标、可选的链接和可选的强制换行。
weak
和unowned
关键词不能再用于协议中的属性声明。- 与 classes 已存在的限制相似, Swift structs 不再允许在一个不同的模块中定义一个初始化器来直接初始化 struct 的字段。在访问 struct 字段前,struct 必须已经调用
self.init
进行了初始化。
想要全面了解所有变更,你可以访问官方的变更日志。
查看英文原文: Swift 4.1 Brings Conditional Conformance and More
感谢罗远航对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们。
评论