欢迎来到第 123 期 Swift Weekly Brief!即使是寒冷的冬天,Swift 开源社区的热情仍丝毫不减。接着往下阅读,看看最近这两周发生了什么。

入门任务

  • SR-9341 [Tooling] Add tests for update-checkout (Python)
  • SR-9373 [Compiler] Clang importer should refuse to import arrays with excessive numbers of elements

社区新闻

Patrick Balesta 写了一篇文章介绍 Swift Benchmark Suite!

Daniel Martín 写了一篇文章介绍向 Swift 语言贡献代码的步骤和小技巧!

Bas Broek 在 try! Swift NYC 的演讲视频演讲稿

Mattt 写了一篇文章介绍在 Visual Studio Code 配置 Swift 开发环境的文章。这要归功于苹果公司对语言服务器协议所做出的努力。

JP Simard 写了一篇文章介绍使用 SwiftSyntax 库实现 SwiftLint 的功能后,发现比原来慢了 20 倍。

合并请求

Michael Ilseman 合并了一个提高 UTF-16 编码字符串性能的 pull request

新晋提案

SE-0234: Remove Sequence.SubSequence 被接受

社区对于提案的反馈非常积极肯定。一些社区成员表示过去尝试实现子序列的时候感到非常烦恼。貌似没有人感觉这个 SubSequence 有实际作用。

审核中提案

SE-0237: Introduce withUnsafe{Mutable}BufferPointerIfSupported methods 正在审核中

这项提案介绍了两个在 SequenceMutableCollection 协议的新方法。这些方法能让范型代码使用 withUnsafe{Mutable}BufferPointer 的语法,同时也能够为标准库的类型打好基础。

SE-0238: Package Manager Target Specific Build Settings 正在审核中

这个提案目的是为 Package.swift 清单文件支持一些常用的,特定于目标的构建设置。顾名思义,特定目标的构建设置仅适用于特定的构建目标。

SwiftPM 目前几乎没有用于定制构建期间如何调用构建工具(编译器,链接器等)的工具。这对于想要进行一些基本自定义构建的开发者来说,是很大的痛点。他们经常不得不采用笨拙的方法来实现,例如,创建用于链接系统库的自定义 modulemap,在 include 目录中链接私有的头文件,更改 include 语句等等。

我们认为通过在 target 层面上提供对某些常见构建设置的支持,可以避免上面提到过的笨拙方法。此提案还为将来提供更丰富的构建设置 API 奠定基础,该 API 支持各种条件表达式,部署选项,构建设置的继承等。

论坛动向

Mark Lacey 写了一份草案关于扩展指定类型的操作符声明,同时这也能解决 Swift 的「表达式过于复杂」(expression too complex)错误。

众所周知,Swift 的表达式类型检查器在类型检查的时候非常慢。

其中一些缓慢的类型检查示例涉及使用运算符的表达式(而其他涉及集合或链式的单表达式闭包)。

该提议能解决那些对于在类型检查过程中,因为运算符过载组合的数量过多而导致的性能问题。

Joe Groff 写了一份草案介绍协议中的「Self or associated type」。

当 Swift 语言刚出现的时候,协议里的「self or associated type」约束是有它存在的技术原因的:那时,protocol witness tables 没有包含相关的类型信息,因此无法动态知道具体的类型,以在遵循关联类型协议的对象上动态分发方法。我们为了递归协议约束(recursive protocol constraints),在不久前已经修复了这个问题,但我们保留了对约束的限制,认为它能有助于避免陷入混淆或设计的死胡同。那时候,上面的约束特性还没有真正完全地支持。

如今,我们也有了协议扩展,因此,即使协议里没有指定 Self 或相关类型的参数,也可以通过扩展来添加方法,因此类型系统的问题已经不可避免地浮现出来了。

Robert Widmann 分享了一篇文章介绍如何为 Swift 编译器贡献代码。

众所周知,C ++ 是一种愚钝的语言,你在开发的时候会感到痛苦。另一方面,LLVM 风格的项目已经划分出了自己的语言子集,并且各自大体一致。如果你想了解更多细节,阅读 LLVM 的编码标准文档(LLVM Coding Standards document)吧。如果你想了解更多 LLVM,包括编程模式,数据结构,算法等,请查看 LLVM 的程序员手册(LLVM Programmer’s Manual)。

我通过实践来学习编程,所以我在学习书籍方面没有什么建议,但我认为如果你花了足够的时间在这上面,你可以很快地熟练 LLVM 风格的代码。

John McCall 分享了 Result 提案的最新动态

根据第一轮的反馈,核心团队一致认为这个功能值得被添加到 Swift 标准库中,我们现在正在收集对提议修订的反馈,这是很重要的一个环节。

感谢参与第一阶段审核的所有人。对于标准化那些广泛使用的及重新实现的类型上,大家的反馈总体上是积极的。

完整的校订过程里包含更多的讨论细节,值得各位一读。

尾声

有时候我发觉,学习 Swift 真的很困难