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 的一部分。
程序员专栏 扫码关注填加客服 长按识别下方二维码进群
近期精彩内容推荐:
在看点这里好文分享给更多人↓↓
来源:oschina
链接:https://my.oschina.net/u/4357668/blog/4649112