上个星期,Apple 公布了今年 WWDC 的日期,而 Swift 开发社区正有序地推进继 Swift 5 后的开发工作。

入门任务

  • TF-336 [Python] Add unit testing infrastructure for Python 2 and 3
  • TF-337 [Python] PythonObject conformance to Sequence uses array indexing instead of Python.iter(...)
  • TF-342 [Python] Adopt Python iterator C API
  • TF-351 [AutoDiff] Fixit .withoutDerivative() is inserted to the wrong place

社区新闻

Chris LattnerBrennan Saeta 在 TensorFlow Dev Summit 2019 关于 Swift for TensorFlow 的演讲视频

SwiftNIO 2 发布临近,官方公开了相关的融合计划。SwiftNIO 2 包括改善了很多公用 API,以及这里有一份很有用的迁移指南。 🚀

Johannes Weiss 正式宣布 swift-log 仓库开源

[..] swift-log 只是开源整个生态系统的序幕。

合并请求

John Holdsworth 合并了一个 pull request 用于实现一个三年前的提案 SE-0068: Expanding Swift Self to class members and value types! 💪

Eric Eckstein 合并了一个 pull request,主要优化内存使用,并某种程度上加快 runtime 的速度。

新晋提案

SE-0242: Synthesize default values for the memberwise initializer 被接受

该提案被接受,并要求修改原始提案以说明实际的行为。核心团队认为该提案应该更明确地描述特定情况下的行为,因为这是审核流程关注比较多的地方。注意:该提案已经更新,在 proposed solution 章节中包含更多详情。

退回提案

SE-0245: Add an Array Initializer with Access to Uninitialized Storage 被退回修改,以作为 SE-0223 的一部分。

审核中提案

SE-0250: Swift Code Style Guidelines and Formatter 正在审核中

SE-0249: Key Path Expressions as Functions 正在审核中

SE-0248: String Gaps and Missing APIs 正在审核中

字符串及相关的类型缺少某些简明易用的函数/属性,而这些简明易用的函数/属性当前已经在内部实现中以某种形式实现了,但尚未公开为 API。我们建议添加 9 个新方法/属性和 3 个新代码单元视图。

这些缺失的 API 解决了 String 用户及其各种类型的用户常遇到的漏洞和缺失的功能,通常会导致开发人员重造相同的轮子

因此我们建议:

  • 为 Unicode 不同的编码新增 6 个简单的 API
  • 为字符串索引和范围索引新增 2 个范型初始化方法
  • Substring.base 应等同于 Slice.base
  • Character.UTF8ViewCharacter.UTF16View 公开
  • 新增 Unicode.Scalar.UTF8View

SE-0247: Contiguous Strings 正在审核中

SE-0246: Generic Math(s) Functions 正在审核中

该提案为标准库引入了两个新协议:ElementaryFunctionsReal。这些协议组合在通用上下文中为浮点和 SIMD 类型提供基本数学函数

BinaryFloatingPoint(以及它提炼的协议)为编写数字代码提供了一组强大的抽象方法,但它不包括由 C 数学库定义的 transcendental 操作。

论坛动向

Michael Ilseman 分享了关于 Swift 5 中字符串 ABI 的一些背景知识

String 的 ABI 为了高性能处理和未来的灵活性进行字符串编码,使标准库运行速度更快,生成的代码更小,更灵活。但是,现在这些底层的 API 还没有暴露出来以供使用,因为它隐藏在 String 类型的背后。我们应该揭开 String 类型的面纱并开始将它们暴露为API。

Michael Munday 分享了一份总结关于枚举类型 enum 的内存结构实现。

Doug Gregor 起草了一份草案关于 Key Path 的成员查找功能。

动态成员查找允许类型为任意成员名称选择扩展成员查找(语法),并将它们转换为运行时解析的字符串。动态成员查找与动态语言之间可以互相操作,其中特定实例的成员只能在运行时确定…但不能更早。因此,动态成员查找倾向于使用围绕外部语言对象的类型擦除封装(例如,对于任意 Python 对象的 PyVal),它们并不提供足够的静态类型信息。

[我们建议]引入一个新属性 @keyPathMemberLookup,它可以放在一个类型的定义上。对于这样的类型,访问成员的语法将被重写为使用特殊的下标,其参数是描述成员的关键路径。

Manolo van Ee 分享了一篇关于 Opaque Result 类型的文章

过去一段时间,我一直在尝试理解 SE-0244Opaque Result Types,最近我发现了一些东西能帮助我更好地理解这个提案。我注意到很多人也对这个提案感到困惑,所以我想写下这篇文章帮助他人更好地理解。

我还尝试将不透明的结果类型或者它背后的基础机制重新命名为我称之为 “反向泛型” 的东西。我认为从略微不同的角度来看这一切能更好地理解所涉及的概念。

Tom Doron 分享一个关于 Swift 服务器端 API 的提案

几乎所有生产服务器软件都需要发出可观察性的度量信息。 SSWG 旨在提供可在整个 Swift Server 生态系统中共享的软件包,因此我们需要一定程度的标准化。由于各方面都不太可能就一个完整的指标实施达成一致,因此该提案正在尝试建立一个可由各种指标后端实现的指标 API,然后将指标数据发布到后端,如 prometheus,graphite,通过 statsd 发布,写入磁盘等常见的指标。

如上所述,我们应该对 API 进行标准化,如果成效很好,应用程序所有者可以使用一致的度量标准来收集解决方案,并从中选择对应的库。

Vinicius Vendramini 起草了一份提案引入自定义 attributes。

Swift 目前支持使用属性标记声明,例如 @objc@deprecated。编译器使用这些属性来更改它解释相应代码的方式。但这些功能目前仍不能满足项目或库的使用。该提案旨在改进这个地方。

Dan ZhengRichard Wei 起草了一份草案计划引入 callables 对象

该提案向 Swift 引入了 callables。值类型可以利用这种语法糖,让它们在被调用时更像函数调用。 简而言之,我们建议引入一个带有关键字 call 的新声明语法:

struct Adder {
    var base: Int
    call(_ x: Int) -> Int {
        return base + x
    }
}

Values that have a call member can be applied like a function, forwarding arguments to the call member.

let add3 = Adder(base: 3)
add3(10) // => 13

尾声

你也曾经引起过小小的内存泄漏吗?🚰