QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

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:001802

评论

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

最火前端Web组态软件(可视化)

尔嵘

大前端 可视化数据分析搭建 web组态 托拉拽组态

第九章学习总结

Kalman

产品经理 产品经理训练营

产品经理训练营作业 06

KingSwim

聊聊Java的异常机制问题

华为云开发者联盟

Java 对象 异常机制 Throwable Error

通过序列号Sequence零代码实现订单流水号

crudapi

低代码 流水号 crud crudapi 序列号

力扣(LeetCode)刷题,简单题(第12期)

不脱发的程序猿

面试 LeetCode 28天写作 算法面经 3月日更

产品经理训练营 - 作业六

胡小湖

vue+element中引入百度地图

尔嵘

Vue Element 百度地图

互联网大厂100道Android面试题助你冲关金三银四!附小技巧

欢喜学安卓

android 程序员 面试 移动开发

五年磨一剑,海外运营商数字化转型与新一代OSS

鲸品堂

方法论 数字化转型 运营商

第 9 周作业 _ 数据分析

园子

nginx配置日志为json格式,nginx按照天实现日志分割,nginx配置负载均衡

Ng

EGG Network公链生态应用EFTalk阿凡提

币圈那点事

AI量化智能交易软件,量化策略系统搭建

nginx做代理访问慢,优化方案

Ng

layui使用templet格式化表格数据

Kubernetes弃用Docker运行时,小甜甜变牛夫人影响了谁?

敏捷调度TASKCTL

Docker 云计算 架构 容器 #Kubernetes#

封装变化的内容

这就是编程

程序开发

中国云基础设施支出创新高,增速全球第一;国内首个区块链特色司法鉴定机构在京成立

京东科技开发者

区块链 人工智能 开发者

图解 | 原来这就是 IO 多路复用

Java 程序员 架构 面试

使用VUE和Element 创建一个dialog对话框组件的详细过程

尔嵘

如何避免水肥一体化过量灌溉?开启智慧管理,一个屏幕轻松搞定

一只数据鲸鱼

物联网 数据可视化 智慧城市 智慧农业

颠覆认知——Redis会遇到的15个「坑」,你踩过几个?

Kaito

redis 踩坑 后端

从优秀到卓越:成为DevOps专家的7项软技能

禅道项目管理

DevOps 趋势 软技能

音频互动连麦使用手册

anyRTC开发者

ios android 音视频 WebRTC RTC

大侠请留步!欢迎有极客精神的你

Lily

单片机如何从上电复位执行到main函数?

不脱发的程序猿

28天写作 嵌入式软件 单片机 3月日更 上电复位执行到main函数

世界首台人工智能地震监测系统问世;AAAI 2021 | 利用深度元学习对城市销量进行预测

京东科技开发者

大数据 红帽

第九章作业

Kalman

产品经理 产品经理训练营

程序开发必备的六个信条

这就是编程

程序开发

剖析Android开发未来的出路在哪里,终局之战

欢喜学安卓

android 程序员 面试 移动开发

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