Swift 4.1带来条件一致性等语言上的提升

\

看新闻很累?看技术新闻更累?试试下载InfoQ手机客户端,每天上下班路上听新闻,有趣还有料!

\
\\

Xcode 9.3中的Swift 4.1带来了一些语言上的提升,包括EquatableHashable协议的自动实现和条件一致性等。

\\

条件一致性

\\

条件一致性即,泛型类型只有在其类型参数满足特定要求的时候才会遵循某个协议。例如,一个Array只有当它的元素也遵循Equatable协议的时候,才能实现Equatable协议。这可以用下列声明表示。

\\
\extension Array: Equatable where Element: Equatable {\  static func ==(lhs: Array, rhs: Array) -\u0026gt; Bool { ... }\}\
\\

这弥补了Swift泛型上的缺陷,使得泛型适配器类型(例如,反映组合类型能力的泛型类型)完全成为可能。例如,在Swift 3中存在4种不同的处理“懒”项目的泛型类型:LazySequenceLazyCollectionLazyBidirectionalCollectionLazyRandomAccessCollection。其中每一种类型都重新实现或者继承了和组合类型相同的API。使用条件一致性,某一种类型的Sequence可以声明遵循懒协议,而无需定义任何中间泛型类型。

\\

Synthesized == and hashValue

\\

Swift 4.1编译器能够为那些声明遵循EquatableHahable协议的structs和enums,生成==hashValue方法的实现。以前,开发者必须自己实现那些方法,而那是一件非常繁琐的任务:在通常情况下,==方法的实现必须比较structs或unions的每一个相应成员;而hashValue方法必须设法保证返回一个唯一的字符串。在Swift 4.1,开发者只需声明遵循那些协议,相关的方法就会自动生成,提供所有存储的分别符合EquatableHashable的属性或枚举值。

\\

Swift 4.1中的其它显著改变如下:

\\
  • 大多数集合库的索引类型现在符合Hashable,可以在key-path下标和哈希过的集合中使用:\\
\let s = \"Hashable\"\let p = \\String.[s.startIndex]\s[keyPath: p] // \"H\"\
\\ 完全实现智能KeyPaths。KeyPath现在支持下标、可选的链接和可选的强制换行。 \\ weakunowned关键词不能再用于协议中的属性声明。 \\ 与classes已存在的限制相似, Swift structs不再允许在一个不同的模块中定义一个初始化器来直接初始化struct的字段。在访问struct字段前,struct必须已经调用 self.init进行了初始化。\\\

想要全面了解所有变更,你可以访问官方的变更日志。

\\

查看英文原文:Swift 4.1 Brings Conditional Conformance and More

\\

感谢罗远航对本文的审校。

\

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至[email protected]。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号:InfoQChina)关注我们。

你可能感兴趣的:(swift,xcode)