此次Swift5.3引入了许多新特性,不仅在语言本身,还增强了Xcode对Swift的支持及对Swift Packages的更新。本文并不打算对所有更新进行说明(实际上也完全没有必要),仅会探索一些重要且有意思的feature,如果想要深入全面了解,WWDC20也有非常多的Session来介绍这些内容,蜗牛都已经整理并贴在了文末。
代码缩进
Xcode12对代码缩进做了不少改善,主要有以下几个方面:
- 链式方法调用,特别是那些涉及嵌套或尾随闭包的调用
- 当元素对齐时,不再缩进调用参数、参数列表、数组和字典文字或元组中的多行表达式
- 多行条件语句(if,guard 和 while)
以guard
为例,在此之前缩进相当僵硬,后面条件总是无法和第一个对齐,并且包体内缩进也有问题
@escaping
闭包中隐式self
在此之前,声明了@escaping
的闭包需要显式使用self
,但现在如果开发者能够确定不存在循环引用,Swift允许在@escaping
闭包中隐式使用self
。
如果用户已经在闭包的捕获列表中明确捕获了self
,则现在允许在@escaping
闭包中隐式使用self
class Test {
var x = 0
func execute(_ work: @escaping () -> ()) {
work()
}
func method() {
execute { [self] in
x += 1
}
}
}
复制代码
另外,如果self
是值类型,无需明确捕获,隐式self
在@escaping
闭包中也可使用:
struct Test {
var x = 0
func execute(_ work: @escaping () -> Void) {
work()
}
mutating func method() {
execute {
x += 1
}
}
}
复制代码
上述代码在之前就会报错:Reference to property 'x' in closure requires explicit 'self.' to make capture semantics explicit
。
减少增量编译
如果有这样的一个类,包含了多个类、结构体或协议,
struct A {
}
struct B {
}
...
复制代码
在此之前,例如修改A,使用A或B的任何文件都将重新编译,而现在仅会对使用A的文件重新编译,这将对修改后编译速度有不错的提升。
如果编译遇到问题,可以在 Other Swift Flags 添加 -disable-type-fingerprints 以将其禁用。如果仍有问题,可以添加 -disable-fine-grained-dependencies ,以禁用新的依赖项基础结构。
Binary Size
Apple一直都在优化二进制文件的大小,从 Swift 4 以来,一直到 5.3 版本,从一开始的 2.3 倍,如今已经优化到 1.5 倍。
对于Swift为什么会需要这么多的binary size,官方解释是因为Swift带有一些“安全”相关的Feature,这些在生成的产物中需要有一定量的代码实现。
以官方Demo对比,使用Xcode12的编译结果就比用Xcode11下降了43%。
Swift Platform Support
更新了支持的多个平台,包括:
- Apple 各OS
- Ubuntu 16.04, 18.04, 20.04
- CentOS 8
- Amazon Linux 2
- Windows(Coming soon,Swift 5.3)
对于非App开发的同学有用,蜗牛只是搬运工

相关文章
- 如何用Swift 实现一个单链表?
- ReactNative iOS 框架源码解析
- 0202 年了,是时候学习 Combine 了
- OpenGL ES之旋转的地球
- 页面加载性能之使用WebP图片
- Android Q & Android 11存储适配(一) 基础知识点梳理
- 为什么编译原理被称为龙书?
- mPaaS / DevOps 是什么?
上一篇: mojito: 麻烦给我的爱人来一份 RxSwift
下一篇: 面试官:给我说说什么是同步异步?