前言
WWDC 20 也过去一段时间了,这次的 WWDC 带给了开发者们不小的惊喜,所以我在这里也尝试记录一下 WWDC 20 之后的新变化。
Swift
众所周知,Swift是苹果现在和未来主推的一门语言。国内外有很多的 APP 项目已经从Objective-C迁移到了Swift。这次的更新想必也会想让更多的开发者蠢蠢欲动转为``Swift Coder`。
Runtime Performance
Code Size
苹果一直在观察Swift项目产物中的__text的大小,从下图我们可以看出,在Swift 5.3里,Code Size已经变成了OC的 1.5 倍。

我们之前常说OC是一门很啰嗦的语言,这一点可以在方法名的调用里看出来,一个多参数的方法调用会生成很长的代码,这样一点也不美观,而生成的Code Size也相应的很大。而Swift在这方面表现的好很多,但为什么Code Size还越来越多了呢?官方的解释是因为Swift带有一些安全相关的 Feature,这些在生成的产物中需要有一定量的代码实现,从而增加了 Size。
Dirty Memory
有Dirty Memory,相应的就有Clean Memory。对于iOS来说Clean Memory指的就是可以被重新创建的内存,主要分为以下几类。
- App 的二进制文件
- framework 中的 _DATA_Const 段
- 文件映射的内存
- 未写入数据的内存
相应的,Dirty Memory指的就是不能被系统回收的内存占用。
现在我们有这么一段代码
1 | // Model |
众所周知,OC中的NSArray存的是对应元素的指针,这个从深浅拷贝就可以看出来。由于Tagged Pointer,某些NSString比较短(没有超过 8 字节),无需用指针存储对象以达到优化。
在Swift中,Array的直接存储值(Swift中数组是直接存储值)最大上限变成了 16 个字节, 15 位的长度可以应对更多的场景。
于是Mountain在两种语言中会有这种区别:

Swift 标准库下沉
Swift Standard Library现在变成了 Foundation的依赖。后续苹果应该会完善 API ,那些只能通过C和OC访问的方法也会逐步迁移。
开发
诊断策略
新版本的Swift Compiler中,更新了新的诊断策略方案
- 使用全新定位代码问题的策略
- 更加精确提示以及可行性更高的提示方案
代码补全
从以下的例子可以看出,Swift的代码提示有了更进一步的加强


Xcode 12 的代码补全速度也有了较大的提高。
语法
多尾随闭包
在之前的Swift中,尾随闭包只允许当成最后一个参数,现在可以有多个尾随闭包了。
1 | UIView.animate(withDuration: 0.3) { |
KeyPath 函数化
在Swift 4.1中引入了KeyPath。新版本中我们可以把KeyPath作为函数使用。
下面的例子里,我们使用KeyPath访问每个属性的shoeSize属性代替复杂的闭包。

隐式 self
在以前的Swift版本中,我们必须显式声明self,而新版本则在闭包中增加隐式self,这个在SwiftUI中很有用处。
但是对于循环引用的闭包,看来[weak self] 和 guard let self = self else {return}还是无法避免显示声明。

多模式捕获
之前的Swift中,我们用try Catch{}往往要进行一些类型判断或者switch case。
在 5.3 中,我们可以使用多个 catch来达到switch的效果。

枚举
- 比较
当enum遵循Comparable时就可以对枚举进行比较。

- enum cases as protocol witnesses
当我们的枚举遵循一些协议的时候,我们不再需要重复写一遍方法名。

后记
笔者已经在早些时候开始转向Swift并在极力 push 公司的项目向Swift转化。
看了这次的WWDC 20,这样的Swift,怎能不爱?