最近有一个备受期待的提案正在审核中,即向标准库引入 Result 类型。😱

所以,请继续阅读关于 Swift 的相关内容以及更令人兴奋的提案进展吧。

入门任务

  • SR-9201 [Compiler] Incorrect error message when using optional chaining
  • SR-9216 [Compiler] Don’t honor SDKROOT in interpreter mode

Swift Unwrapped

Jesse 和 JP 讨论了 由 Doug Gregor 起草 的关于透明 Result 类型的提案。

社区新闻

Mattt 写了一篇文章介绍语言服务器协议(LSP),「这可能是苹果自 2014 年开源 Swift 以来做的最重要的一件事了」。

SwiftNIO 现在可以通过 CocoaPod 安装!

Vapor 正考虑将核心库分离成两个新的库:NIOKitCodableKit

合并请求

David Smith 合并了一个改进 String 桥接性能的 pull request

接受提案

SE-0233: Make Numeric Refine a new AdditiveArithmetic Protocol 过去处于审核状态 ,现在已经被接受了

这个提案建议引入一个新的 AdditiveArithmetic 协议,这是相对现有的 Numeric 协议的弱化版本,该协议定义了加法算术运算符和零,因此,遵守协议的类型能大致符合加法群的概念。我们可以将泛型的 AdditiveArithmetic 协议应用于矢量类型和标量类型,从而使这两类型能共享加法运算符。

对于该提案社区的反馈比较少,但都是积极的。核心团队就这个提案讨论了是否应该将一元加号运算符 +Numeric 协议移动到 AdditiveArithmetic 层面,最终,这个书面提案未被修改就被接受了。

退回提案

SE-0229: SIMD Vectors, Take 2 被退回修改

最新的提案及实现方案已经更新。

总结一下:

  • 主要的工作类型现在使用 Vector3<T> 而不是之前提到过的 T.Vector3 - Sequence 现在提供可以初始化各种元素类型的初始化器
  • 所有掩码操作都在前面加上 .
  • count 被重命名为 elementCount
  • init(gathering: at:) 被移除,我们打算在后面的提案中用一个更合适的方法替换它
  • 用户可以通过使用让类型 T 遵循新的 SIMDVectorizable 协议从而为 VectorN<T> 提供任意类型
  • 所有的 min, maxclamp 方法都被移除,我们打算在后续提案中重新引入这个功能(可能具有不一样的绑定)
  • IntegerVectorFloatingPointVector 被移除,取而代之,你应该使用 conditional conformances

驳回提案

SE-0231: Optional Iteration 被驳回

尽管核心团队赞同在包含 Optional 的集合里遍历元素是一件很常见的事,他们仍然驳回了这个提案。

来这里阅读更加完整的驳回理由

审核中提案

SE-0235: Add Result to the Standard Library 正在审核中

Swift 当前的错误处理使用 throwstrycatch,通过显式语法和运行时行为自动同步地处理错误。另一方面,这样缺乏覆盖语言中所有错误传播及处理所需的灵活性。Result 是一种在 Swift 和其他语言社区常见的,用于手动传播和处理错误的类型。因此这个提案旨在将这种类型添加到标准库中。

SE-0236: Package Manager Platform Deployment Settings 正在审核中

这是提案主要用于 Package.swift 清单文件,目的是支持指定部署到各个平台所需满足的最小版本号。

依赖包应该能够声明目标平台部署的最小版本号。SwiftPM 当前使用一个硬编码的值作为 macOS 平台的最小部署版本。现在这个做法可能会产生一些问题。

论坛动向

Michael Ilseman 写了一篇帖子介绍字符串的应用二进制接口 (ABI),现在 Swift 的原生字符串将全部使用 UTF-8 编码。

我们已经将字符串最终的应用二进制接口(ABI)代码合并到 master 分支。这里面包含一些重要的变化,其中最重要的是 Swift 字符串现在统一使用 UTF-8 编码保存,它们之前是根据内容以 ASCII 或者 UTF-16 编码保存的。NSString 仍然以惰性桥接的方式桥接到 String,注意它们桥接的时候并没有开辟新的内存空间。

这些改动不会影响到公开的 API,但是却能以某种程度提高字符串的性能,为将来的 API 打好更一致的基础,从而最终实现对底层代码单元的高效直接访问。UTF-8 是一种单字节的 Unicode 编码,是 C 语言编程,系统编程,服务器端编程,脚本编程,客户端编程及处理源代码和文本格式工具的首选编码。

经过这个更改后,标准库的二进制文件大小减少了约 13%!

Vapor 正在从其核心库中分离出两个新的库。

我们打算在 Vapor 4 发布的时候将两个全新的库从 Vapor 主项目分离出来,包括 NIOKitCodableKit。过去两年,我们围绕 Vapor 写了很多工具代码,导致主项目代码数量非常庞大。我们打算将其中一些有用的代码剥离出来,回馈整个服务器社区。

Johannes Weiss 写了一篇帖子介绍 SwiftNIO 2 以及 Swift 5 与它的关系。

我相信你肯定知道,第一个 Swift 5 版本很快就会发布,更不用说 SwiftNIO 想要使用 Swift 5 新出的全部新特性 (如原生的 UTF-8 字符串)。除此之外,SwiftNIO 已经积累了很多 issues 和 pull requests,只能通过发布全新的 2.0.0 版本来解决。

我们的计划是跟随 Swift 5.0 的步伐,一起发布 SwiftNIO 2.0。NIO 2.0 需要依赖 Swift 5,并且会有很多跟之前版本不兼容的 API。你可以通过全局搜索及替换来将 NIO 1 的代码迁移到 NIO 2。放心,我们会维护一份列表,列出需要更改的地方。

尾声

爱死了 这个 Result 类型!