最近有一个备受期待的提案正在审核中,即向标准库引入 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 正考虑将核心库分离成两个新的库:NIOKit 和 CodableKit。
合并请求
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
,max
和clamp
方法都被移除,我们打算在后续提案中重新引入这个功能(可能具有不一样的绑定)IntegerVector
和FloatingPointVector
被移除,取而代之,你应该使用 conditional conformances
驳回提案
SE-0231: Optional Iteration 被驳回。
尽管核心团队赞同在包含
Optional
的集合里遍历元素是一件很常见的事,他们仍然驳回了这个提案。
来这里阅读更加完整的驳回理由。
审核中提案
SE-0235: Add Result to the Standard Library 正在审核中。
Swift 当前的错误处理使用
throws
,try
和catch
,通过显式语法和运行时行为自动同步地处理错误。另一方面,这样缺乏覆盖语言中所有错误传播及处理所需的灵活性。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 主项目分离出来,包括 NIOKit 和 CodableKit。过去两年,我们围绕 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。放心,我们会维护一份列表,列出需要更改的地方。