写点什么

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

评论

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

「SQL数据分析系列」6. 使用集合

Databri_AI

sql 集合

JavaScript 学习(四)

空城机

JavaScript 大前端 6月日更

模块六作业

Chris Cheng

架构训练营

有了这个组合拳,不再写bug

看山

DevOps 6月日更

校外培训行业迎来强监管,“教育+区块链”新模式试图解决行业痼疾

CECBC

SpringCloud Gateway 动态路由

中原银行

微服务 SpringCloud Gateway 中原银行

为什么中间件协议对区块链生态系统至关重要?

CECBC

🌏【架构师指南】分布式ID生成算法技术总结

码界西柚

分布式ID 6月日更

Fuchsia OS vs Harmony OS 谁是下一个领跑

三掌柜

试用期 签约计划

致翻译界最可爱的许老

Qien Z.

翻译 6月日更

并发王者课-铂金2:豁然开朗-“晦涩难懂”的ReadWriteLock竟如此妙不可言

MetaThoughts

Java 多线程 并发

【21-10】PowerShell 日期和时间

耳东@Erdong

PowerShell 6月日更

Taro3无埋点的探索与实践

GrowingIO技术专栏

taro AST sdk 无埋点 babel

Low-Code能否威胁到专业的程序员?| 话题

三掌柜

试用期 签约计划 人气作者 TOP10

Flink State 和 Fault Tolerance(一)

Alex🐒

flink 翻译 flink1.13

C++友元的概念和使用的一些介绍

良知犹存

c++

运维大佬嘲笑我,这个你都不知道?

李阿柯

redis 面试 运维自动化

网络攻防学习笔记 Day47

穿过生命散发芬芳

网络攻防 6月日更

苹果iOS内购三步曲:App内退款、历史订单查询、绑定用户防掉单!--- WWDC21

37手游iOS技术运营团队

ios wwdc 苹果退款 appstore WWDC21

很多小伙伴问我推荐什么书籍和网课,这次把私藏很久的资料都贡献了(上)

C语言与CPP编程

Java c++ C语言 数据结构与算法 #python

数据库事务与锁详解

阿骆麦迪

MySQL 事务 6月日更

Kubernetes手记(14)- 用户权限系统

雪雷

k8s 6月日更

“懂行”共识拓宽数字通道:川蜀大地与智能时代的“热辣”共振

脑极体

Java Selector模型

邱学喆

buffer selector SelectableChannel SelectionKey

react源码解析15.scheduler&Lane

全栈潇晨

React

前端 JavaScript 之『防抖』的简单代码实现

编程三昧

JavaScript 编程 大前端 防抖 函数节流

MySQL基础之十五:索引

打工人!

MySQL 6月日更

如果把四个消息队列都拉到一个群里,他们会聊些什么?

悟空聊架构

故事 消息队列 群聊 6月日更 悟空聊架构

【Vue2.x 源码学习】第十七篇 - 生成 render 函数 - 函数生成

Brave

源码 vue2 6月日更

为什么 StringBuilder 不是线程安全的?

xcbeyond

StringBuilder StringBuffer 6月日更

鸿蒙 和 Fuchsia OS,你更期待谁?

Bob

华为 Google 作业一 Fuchsia 鸿蒙系统

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