WWDC20 第四弹 - Swift的新特性

2020-10-17 15:37:19 蜻蜓队长

此次Swift5.3引入了许多新特性,不仅在语言本身,还增强了Xcode对Swift的支持及对Swift Packages的更新。本文并不打算对所有更新进行说明(实际上也完全没有必要),仅会探索一些重要且有意思的feature,如果想要深入全面了解,WWDC20也有非常多的Session来介绍这些内容,蜗牛都已经整理并贴在了文末。

代码缩进

Xcode12对代码缩进做了不少改善,主要有以下几个方面:

  • 链式方法调用,特别是那些涉及嵌套或尾随闭包的调用
  • 当元素对齐时,不再缩进调用参数、参数列表、数组和字典文字或元组中的多行表达式
  • 多行条件语句(if,guard 和 while)

guard为例,在此之前缩进相当僵硬,后面条件总是无法和第一个对齐,并且包体内缩进也有问题

Xcode12中就舒服多了

@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开发的同学有用,蜗牛只是搬运工

以上内容来自于网络,如有侵权联系即删除
相关文章

上一篇: mojito: 麻烦给我的爱人来一份 RxSwift

下一篇: 面试官:给我说说什么是同步异步?

在线咨询
客户经理