70+专家分享实战经验,2024年度AI最佳实践都在AICon北京 了解详情
写点什么

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

评论

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

[Day26]-[BST] 验证BST

方勇(gopher)

LeetCode BFS 数据结构与算法

考试试卷存储方案

小虾米

架构实战营

丰富多彩的管理端—主题功能介绍

中原银行

前端 中原银行 主题 管理端工程

vue2.x版本中Object.defineProperty对象属性监听和关联

程序猿布欧

JavaScript Vue vuejs 数据响应式原理 Javascript框架

如何写好B端产品的技术方案?

架构师汤师爷

SaaS 架构设计 技术方案 B端产品

STM32+华为云IOT制作酒驾监控系统:上车就监控

华为云开发者联盟

mqtt stm32 华为云IoT 酒驾 酒驾监控系统

Java架构师面试题系列之Mybatis面试专题(36题,含详细答案解析

爱好编程进阶

Java 程序员 后端开发

Java学习笔记-集合

爱好编程进阶

Java 程序员 后端开发

Java实现栈和队列

爱好编程进阶

Java 程序员 后端开发

CentOS 8 更新提示 appstream 错误

HoneyMoose

redis优化系列五Sentinel 实现原理常见问题

乌龟哥哥

4月月更

Java基础19 IO基础

爱好编程进阶

程序员 后端开发

【建议收藏】整理Golang面试第二篇干货13问

利志分享

golang golang 面试

Java基础面试题——集合

爱好编程进阶

Java 程序员 后端开发

Spring Data MongoDB 使用示例

Java mongodb 4月月更

毕业设计-设计电商秒杀系统

孙强

#架构实战营

Java并行程序基础

爱好编程进阶

Java 程序员 后端开发

场景化组件开源,融云持续回馈开源生态

融云 RongCloud

DDIA 读书笔记(一):可靠、可扩展、可维护

Geek_4zc1nt

数据库 分布式系统 数据系统 DDIA 设计数据密集型应用

C语言总结_数组知识

DS小龙哥

4月月更

Java中级面试题及答案整理

爱好编程进阶

程序员 后端开发

融云洞察:打造社交元宇宙,从「读懂 00 后」开始

融云 RongCloud

融云实践:实时音频混音在 Web 端的探索与实践

融云 RongCloud

Go 语言入门很简单:net/url 包

宇宙之一粟

url Go 语言 4月月更

Java如何支持函数式编程?

爱好编程进阶

Java 程序员 后端开发

【直播回顾】OpenHarmony知识赋能第五期第一课——精益开源

OpenHarmony开发者

OpenHarmony 成长计划

戊申篇「股權去中心化」《「內元宇宙」聯載》

因田木

去中心化金融 商業因果

资讯|WebRTC M99 更新

网易云信

WebRTC

Java异常面试题

爱好编程进阶

Java 程序员 后端开发

把pinpoint编译环境做成Docker镜像文件

程序员欣宸

4月月更

Java开发5年从星瑞15K跳槽去腾讯32K+16,啃完这份笔记你也可以

爱好编程进阶

Java 程序员 后端开发

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