WWDC22: Platforms State of the Union - Part 1
发布
更新
字数
531
阅读
3 分钟
阅读量
584
Swift
Async Algorithms
序列协议
使用 zip
算法,将两个序列组合在一起
for (number, letter) in zip(numbers, letters) {
print(number, letter)
}
而异步算法可以将两个异步序列组合在一起
for await (number, letter) in zip(numbers, letters) {
print(number, letter)
}
还可以使用 try
/ catch
匹配符处理问题
do {
for try await (number, letter) in zip(numbers, letters) {
print(number, letter)
}
} catch {
// Handle network failure
}
像编写同步代码一样简便、安全
Actor Model
actor model 隔离状态,使用 distributed actors 可以保证线程安全的前提下,在多个进程或设备间通信
distributed actor networkClient
字符串处理
Swift Regex
使用正则表达式在字符串中提取想要的信息,为改善这一体验,Swift 引进了正则表达式字面值,Swift 编译器会自动检查正确性。
let regex: Regex<(Substring, Substring, Substring, Substring, Substring)> =
/(\w+)\s\s+(\S+)\s\s+((?:(?!\s\s).)*)+(.*)/
Playgrounds 示例
import RegexBuilder
// Establishment Donut Type Amount
// | | |
// ---------------- ------------- --------
let order = "Order from <Besty's Bakery>, type: maple frosted, count in dozen: 3"
let regex = /Order from <(.*)>, type: (.*), count in dozen: ([0-9]+)/
order.firstmatch(of: regex)
// ------------------------
//
// Library Address
// | |
// ------------ -----------------
let log = "0 FoodTruckKit 0x000000018a0e5d88 donut.bake() + 144"
// let logRegex = /\s+([a-zA-Z_.]+)\s+(0x[\da-fA-F]+)/
// 使用 Regex Builder
let logRegex = Regex {
OneOrMore(.whitespace)
Capture {
OneOrMore {
CharacterClass(
.anyOf("_."),
("a"..."z"),
("A"..."Z")
)
}
}
OneOrMore(.whitespace)
Capture {
"0x"
//OneOrMore {
// CharacterClass(
// .digit,
// ("a"..."f"),
// ("A"..."F")
// )
//}
// 使用 hex digit character class 简化
OneOrMore(.hexDigit)
}
}
log.firstmatch(of: logRegex)
泛型
使用 some
关键词,可以用更少的代码表达同样的意思,而且,更有表现力。
func playSongs<Playlist>(in playlist: Playlist) where Playlist: Collection, Playlist.Element == Song { ... }
// 可以简化为
func playSongs(in playlist: some Collection<Song>) { ... }
新的关键词 any
可以用在动态类型上,如一个曲库可能包含不同类型的歌曲集合
func playSongs(in playlist: some Collection<Song>) { ... }
struct MusicLibrary {
var playlists: [any Collection<Song>]
func playAll() {
for playlist in playlists {
playSongs(playlist)
}
}
}
结合熟悉的语法和更自然的关键词,使用 Swift 编写泛型代码变得更轻而易举。
Swift Package Manager
Package Plugins
通过扩展 Xcode,帮助你使用 package 构建应用。