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 构建应用。