一图读懂 Swift 5.3

Python实战社群

Java实战社群

长按识别下方二维码,按需求添加

扫码关注添加客服

进Python社群▲

扫码关注添加客服

进Java社群


作者 | Holly Borla 
来源 | swift.org/blog

Swift 5.3 正式发布,Amy Tsai 绘制了一张素描图,列出了 Swift 5.3 的主要新特性。这张图描述了 Swift 5.3 的一些新特性以及目标:继续专注于语言改进,开发体验以及扩展 Swift 生态系统,以让 Swift 适用于更多场景。

语言和标准库

新特性和改进

Swift 5.3 在语言方面做了不少改进,改善了 Swift 编码体验。这些更新的重点是减少样板和冗余代码,以及在标准库中定义更多功能,从而提高 Swift 程序员的生产力。

Swift Evolution 中的以下条款在 Swift 5.3 中得以实现:

  • SE-0263 - Add a String Initializer with Access to Uninitialized Storage

  • SE-0266 - Synthesized Comparable conformance for enum types

  • SE-0267 - where clauses on contextually generic declarations

  • SE-0268 - Refine didSet Semantics

  • SE-0269 - Increase availability of implicit self in @escaping closures when reference cycles are unlikely to occur

  • SE-0276 - Multi-Pattern Catch Clauses

  • SE-0277 - Float16

  • SE-0279 - Multiple Trailing Closures

  • SE-0280 - Enum cases as protocol witnesses

  • SE-0281 - @main: Type-Based Program Entry Points

  • SE-0282 - Clarify the Swift memory consistency model ⚛︎

  • SE-0285 - Ease the transition to concise magic file strings

  • SE-0286 - Forward-scan matching for trailing closures

Swift 5.3 还修复了几个常见的编译器限制问题:

  • SR-75 - Unapplied references to protocol requirements are now supported

  • SR-7083 - lazy properties can define didSet and willSet accessors

  • SR-8814 - Generic classes can use default implementations of protocol requirements when conforming to protocols with associated types

运行时性能改进

Swift 5.3 显著改善了进进制代码大小和运行时内存使用率。这些改进所带来的成果通过多个项目得到了验证:

  • 从 Swift 4 开始,Swift 团队就通过一个 UIKit 应用(用 Objective-C 编写)来衡量 Swift 重写的二进制代码大小。Swift 4 的代码量约为 Objective-C 的 2.3 倍,到 Swift 5.3 时降到 1.5 倍以下。

  • 基于 SwiftUI 的开源应用 MovieSwiftUI,Swift 5.3 重写的代码量与 Swift 5.1 相比,减少了 40% 以上;

  • 在一个创建包含 400 个模型对象的数组的测试应用程序中,由于运行时开销而导致的堆内存比 Swift 5.1 中使用的堆内存少了 2/3。

二进制大小的改进因使用方式而有所不同。这种改进对通过减小“值函数”的大小来声明大量类型的项目意义特别重大,“值函数”是编译器为创建,复制和销毁值类型而生成的不可见函数。这对 SwiftUI 应用程序特别有利。

此外,Swift 应用程序现在在运行时的堆内存开销比较低。Swift 运行时在运行时会缓存较少的信息以跟踪协议一致性之类的信息,而运行时的改进使这类缓存的必要性降低。现在,用 Swift 编写的应用程序比使用 Objective-C 编写的其他程序所使用的堆内存更少。

开发体验

缩进

Swift 5.3 修改了 SourceKit 中的自动缩进实现,在以下几种情形下,自动缩进有了很大的改进:

  • 装饰的链式方法调用;

  • 调用时跨越多行的参数、集合元素;

  • if, guard 和 while 的条件分多行时

代码补全

Swift 5.3 进一步优化了代码补全的性能和质量:

  • 与 5.2 相比,函数体内的重复的代码补全现在快了 15 倍;这是通过在同一文件中重用一些已完成的计算操作来实现的。这些优化在 Xcode 和 SourceKit-LSP 中都可用

  • Swift 代码补全现在支持用户定义的类型的可调用值(SE-0253)。代码补全显示了在基本表达式后加上圆括号的调用签名

优化构建

Swift 5.3 为编译器如何处理 Swift 代码中的声明引入了新策略。这些更改带来了一些显著的优化:

  • 通过避免跨源文件重复进行编译器工作,并更准确地标识与以前的构建相比未更改的代码,从而缩短了增量构建时间;

  • 通过修复编译器的行为对声明顺序或嵌套敏感的多种情况,提高了正确性;

  • 使用从其他库导入的有大量属性和函数的类型的代码,可以更快地进行编译;

这些优化是通过在编译器中更广泛地采用新的集中式框架来实现的,该框架可记录细粒度的依赖项信息,缓存可能需要重复进行的昂贵计算结果,并自动在 Swift 代码中检测依赖项周期。

诊断

Swift 5.3 在 Swift 5.2 的诊断优化基础上,又进一步提高了错误消息的质量和准确性,尤其是在 SwiftUI 代码中。更具体地说,Swift 5.3 现在已完成向新诊断体系结构的过渡!

5.3 中的许多诊断优化都涉及复杂的泛型代码,其中泛型参数会有一些错误的情况,例如缺少一致性。例如,考虑以下代码:

struct FormList<FieldID> {
  init<Data: Collection>(_ data: Data) where Data.Element: Identifiable,
                                             FieldID == Data.Element.ID { ... }
}

struct Field {
  let id: String
}

func createForm(fields: [Field]) {
  let form = FormList(fields)
}

在 Swift 5.2 中,编译器会报告了一个非常隐秘的错误消息:

error: expression type 'FormList<_>' is ambiguous without more context
  let form = FormList(fields)
             ^~~~~~~~~~~~~~~~

在 Swift 5.3 中,编译器可以正确报告问题,并提供有用的注释:

error: initializer 'init(_:)' requires that 'Field' conform to 'Identifiable'
  let form = FormList(fields)
             ^
             
note: where 'Data.Element' = 'Field'
  init<Data: Collection>(_ data: Data) where Data.Element: Identifiable,
  ^

调试

Swift 5.3 为运行时错误提供了更好的错误消息。当调试信息可用时,调试器现在将在标准库中显示陷阱的原因,而不仅仅是显示不透明的无效指令崩溃。

现在,当调试在不同计算机上编译的二进制文件时,LLDB 更加强大:

  • 来自构建机器的 SDK 路径会自动识别并重新映射到本地路径;

  • 源和包含路径可以选择使用 .dSYM 路径重映射字典进行重映射;

生态

Swift Package Manager

资源(SE-0271)

包现在可以包含运行时所需的资源,例如图像和其他数据文件。资源按 target 确定范围,并在构建程序包时进行处理并嵌入到客户端应用程序中。可以使用 Foundation 的 Bundle API 从源码中访问资源。

Apple 平台特有的资源(例如资源目录,storyboards 和 CoreData 模型)只能在 Xcode 中构建,但是所有平台都支持通用资源。包清单中的新 API 提供了对将哪些源文件视为资源的控制。

本地化(SE-0278)

包现在可以包含可本地化的内容,例如 .strings 文件和资源的本地化变体。可本地化的内容可以使用 .lproj 目录添加到程序包中,并且可以使用 Foundation API 进行访问。

二进制依赖性(SE-0272)

软件包现在可以以 XCFrameworks 形式分发预构建库,从而允许依赖于不能作为源代码分发的库。该功能当前仅在为 Apple 平台构建时可用。包清单中的新 API 允许 XCFrameworks 被引用为二进制目标。

条件目标依赖(SE-0273)

现在可以将软件包目标的依赖项声明为有条件的,可以用来限制平台的依赖项。这为描述支持多个平台的复杂目标依赖关系提供了更大的灵活性。

请注意,基于构建配置的条件也是 Swift Evolution 的一部分,但尚未实现,因此不是 Swift 5.3 的一部分。

程序员专栏 扫码关注填加客服 长按识别下方二维码进群

近期精彩内容推荐:  

 刚刚用鸿蒙跑了个“hello world”!

 裸辞1天 vs 裸辞10天 vs 裸辞一个月

 分布式id生成策略,我和面试官扯了一个半小时

 Python中浅拷贝与深拷贝的骚操作

在看点这里好文分享给更多人↓↓

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值