本文总结自WWDC 2022 《What’s new in Swift》
Optional unwrapping
在对可选值进行解包的时候,可以用一种更简便的方式
Swift 5.5
1 | var name : String? = "Linda" |
1 | if let name = name { |
Swift 5.7
1 | if let name { |
Multi-statement closure type inference
当闭包表达式内有多行语句的时候,可以不用显式声明返回值类型
1 | let scores = [100,80, 85] |
Swift 5.5
1 | let oldResults = scores.map { score -> String in |
Swift 5.7
1 | let results = scores.map { score in |
Regular expressions
新增正则表达式工具 Regex
,支持正则语法检查
举例:取出句子中的”at”的range
1 | let message = "the cat sat on the mat" |
Swift 5.7 使用字符串初始化Regex,若传入不符合语法规则的正则表达式,则会throw error
1 | do { |
另外可以使用/ /
包裹正则表达式(字面量语法),当传入不符合语法规则的正则表达式的时候,编译器将会报错
1 | print(message.ranges(of: /[a-z]at/)) |
此外,Swift 5.7还新增了一种DSL的语法去做类似正则表达式的事情,如下:
1 | let search = /My name is (.+?) and I'm (\d+) years old./ |
等价于
1 | let search = Regex { |
Protocol and generics
针对泛型协议,可以使用any
和some
关键字来简洁编码
1 | protocol Pizza { |
Swift 5.5
这里传入的参数可以是任意遵循了Pizza
的类或者结构体的实例
1 | func receivePizza(_ pizza: Pizza) { |
Swift 5.7
1 | func receivePizza(_ pizza: any Pizza) { |
Swift 5.5
这里传入的参数可以是某一个遵循了Pizza
的类或者结构体的任意实例,类型T需要确定
1 | func receivePizza<T : Pizza>(_ pizza: Pizza) { |
Swift 5.7
1 | func receivePizza(_ pizza: some Pizza) { |
Some 和 Any
some
和any
其实是以前就有的关键字
some : 指定某种遵循了协议A的类型
any : 任意遵循了协议A的类型
举例:
下面代码会报错,提示Cat不能复制给animal,因为animal已经被指定为Dog类型了
1 | var animal : some Animal = Dog() |
下面代码不会报错,因为animal可以是任意遵循了Animal协议的类的实例
1 | var animal : any Animal = Dog() |
同理,会报错,因为some只能指定一种类型
1 | let animals : [some Animal] = [Dog(),Cat()] |
不会报错,因为any能指定任意遵循了Animal协议的类型
1 | let animals : [some Animal] = [Dog(),Cat()] |
那到底什么时候用some
,什么时候用any
呢?
答:当你在设计接口的时候就已经默认是某个类型的时候,就用some
,当不符合上述要求的时候就用any
Swift Package Plugins
Swift新增的插件,就是可以用swift写脚本,然后可以在Xcode构建的时候运行。比如代码格式化,产出代码统计报告等
Swift Concurrency Instrument
在Instrument里面新增了针对awiat
相关代码的性能检测