写点什么

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

  • 2018-02-23
  • 本文字数:1055 字

    阅读完需:约 3 分钟

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

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

条件一致性

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

复制代码
extension Array: Equatable where Element: Equatable {
static func ==(lhs: Array<element>, rhs: Array<element>) -> Bool { ... }
}
</element></element>

这弥补了 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 中的其它显著改变如下:

复制代码
let s = "Hashable"
let p = \String.[s.startIndex]
s[keyPath: p] // "H"
  1. 完全实现智能 KeyPaths 。KeyPath 现在支持下标、可选的链接和可选的强制换行。
  2. weakunowned关键词不能再用于协议中的属性声明
  3. 与 classes 已存在的限制相似, Swift structs 不再允许在一个不同的模块中定义一个初始化器来直接初始化 struct 的字段。在访问 struct 字段前,struct 必须已经调用self.init进行了初始化。
    想要全面了解所有变更,你可以访问官方的变更日志

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


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

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

2018-02-23 18:002129

评论

发布
暂无评论
发现更多内容

大数据培训的前途怎么样

小谷哥

web前端培训班学习前景怎么样

小谷哥

JavaScript刷LeetCode拿offer-高频链表题

Geek_07a724

JavaScript LeetCode

【LeetCode】最长同值路径Java题解

Albert

算法 LeetCode 11月月更

JS词法环境和执行上下文

hellocoder2029

JavaScript

JS知识点梳理之作用域、作用域链、柯里化、闭包

hellocoder2029

JavaScript

声网首席科学家钟声:感知实时互联网

声网

人工智能 模型

JavaScript刷LeetCode拿offer-位运算

Geek_07a724

JavaScript LeetCode

推荐一份关于JDK实现&源码解读的经典著作,强烈建议Java程序员都看看

程序员小毕

程序员 程序人生 Java并发 后端 jdk源码

别再自己瞎写工具类了,Spring Boot 内置工具类应有尽有, 建议收藏!!

程序知音

Java spring springboot java面试 后端技术

细说js变量、作用域和垃圾回收

hellocoder2029

JavaScript

什么是双机热备?实现方式有哪些?

行云管家

高可用 ha 热备 双机热备

前端leetcde算法面试套路之树

js2030code

JavaScript LeetCode

赛况激烈!2022 OceanBase数据库大赛50强诞生

OceanBase 数据库

大数据培训和自学哪个好

小谷哥

刷完这19道leetcode二分查找算法,不信进不了大厂

Geek_07a724

JavaScript LeetCode

vivo鲁京辉:从体验到生态,守正创新,vivo隐私安全再升级

极客天地

说说Nodejs高并发的原理

coder2028

node.js

java培训学习机构怎么选择

小谷哥

IM通讯协议专题学习(一):Protobuf从入门到精通,一篇就够!

JackJiang

网络编程 即时通讯 IM

深入理解Metrics(三):Histograms

冰心的小屋

Java metrics Histograms

前端leetcde算法面试套路之二叉树

js2030code

JavaScript LeetCode

自学前端没有找到工作,怎么做呢

小谷哥

AR空间音频能力,打造沉浸式声音体验

HarmonyOS SDK

华为 AR HMS Core

河北省等保测评机构新名单-行云管家

行云管家

网络安全 堡垒机 等级保护 等保测评 等级测评

🍃【Spring专题】「开发指南」手把手教你将@Schedule任务调度升级为分布式调度@DistributeSchedule

码界西柚

spring 分布式任务调度 任务调度 scheduler 11月月更

全网首次公开!设计模式+代码+JVM调优,不愧是阿里Java性能优化核心原理全解手册

Java全栈架构师

程序员 程序人生 性能优化 后端 java面试

转行数据分析?你可能需要这块敲门砖!

博文视点Broadview

【收藏】锂电材料工厂设备日常保养评分标准

PreMaint

设备管理 设备日常保养

【C语言】double 关键字

謓泽

11月月更

Swift 4.1带来条件一致性等语言上的提升_开源_Sergio De Simone_InfoQ精选文章