WWDC 20 的那些事儿

前言

  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 倍。

SwiftCodeSize

  我们之前常说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
2
3
4
5
6
7
8
9
10
// Model
@interface Mountain: NSObject
{
NSUUID *uuid;
NSString *name;
float *height;
}
@end
NSArray<Mountain *> *mountains = loadMountains()

  众所周知,OC中的NSArray存的是对应元素的指针,这个从深浅拷贝就可以看出来。由于Tagged Pointer,某些NSString比较短(没有超过 8 字节),无需用指针存储对象以达到优化。

  在Swift中,Array的直接存储值(Swift中数组是直接存储值)最大上限变成了 16 个字节, 15 位的长度可以应对更多的场景。

  于是Mountain在两种语言中会有这种区别:

dirty memroy

Swift 标准库下沉

  Swift Standard Library现在变成了 Foundation的依赖。后续苹果应该会完善 API ,那些只能通过COC访问的方法也会逐步迁移。

开发

诊断策略

  新版本的Swift Compiler中,更新了新的诊断策略方案

  • 使用全新定位代码问题的策略
  • 更加精确提示以及可行性更高的提示方案

代码补全

  从以下的例子可以看出,Swift的代码提示有了更进一步的加强

三元表达式的补全

KeyPath

  Xcode 12 的代码补全速度也有了较大的提高。

语法

多尾随闭包

  在之前的Swift中,尾随闭包只允许当成最后一个参数,现在可以有多个尾随闭包了。

1
2
3
4
5
UIView.animate(withDuration: 0.3) {
self.view.alpha = 0
} completion: { _ in
self.view.removeFromSuperview()
}

KeyPath 函数化

  在Swift 4.1中引入了KeyPath。新版本中我们可以把KeyPath作为函数使用。

  下面的例子里,我们使用KeyPath访问每个属性的shoeSize属性代替复杂的闭包。

函数化

隐式 self

  在以前的Swift版本中,我们必须显式声明self,而新版本则在闭包中增加隐式self,这个在SwiftUI中很有用处。

  但是对于循环引用的闭包,看来[weak self] 和 guard let self = self else {return}还是无法避免显示声明。

隐式 self in SwiftUI

多模式捕获

  之前的Swift中,我们用try Catch{}往往要进行一些类型判断或者switch case

  在 5.3 中,我们可以使用多个 catch来达到switch的效果。

多模式捕获

枚举

  • 比较

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

比较

  • enum cases as protocol witnesses

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

enum cases as protocol witnesses

后记

  笔者已经在早些时候开始转向Swift并在极力 push 公司的项目向Swift转化。

  看了这次的WWDC 20,这样的Swift,怎能不爱?

参考

What’s new in Swift