1、新的时间表示法
SE-0329 为 Swift 引入了一种新的标准化方式来引用时间和持续时间。它可以拆解为三个主要部分:
-
Clock
:表示一种测量时间流逝的方式。又分为 2 种。-
ContinuousClock
:系统处于睡眠状态时也会记录时间。 -
SuspendingClock
:系统处于睡眠状态时不会记录时间。
-
-
Instant
:表示一个精准的瞬间时间。 -
Duration
:表示 2 个Instant
之间的时间间隔。
// 当前时间 + 3秒
ContinuousClock.Instant.now + Duration.seconds(3)
// 当前时间 + 50毫秒
ContinuousClock.Instant.now + Duration.microseconds(50)
// 应用于Concurrency
try await Task.sleep(until: .now + .seconds(1), clock: .suspending)
try await Task.sleep(until: .now + .seconds(1), tolerance: .seconds(0.5), clock: .continuous)
// 异步函数
func doSomeAsyncWork() async throws {
try await Task.sleep(until: .now + .seconds(1), clock: .continuous)
}
// SuspendingClock
let suspendingClock = SuspendingClock()
// 测量
let elapsedOne = try await suspendingClock.measure {
try await doSomeAsyncWork()
}
// ContinuousClock
let continuousClock = ContinuousClock()
// 测量
let elapsedTwo = try await continuousClock.measure {
try await doSomeAsyncWork()
}
2、顶级代码的并发
SE-0343 升级了 Swift 对顶级代码的支持——想想 macOS 命令行工具项目中的 main.swift —— 以便它支持开箱即用的并发。这个变化看起来微不足道,但为了支持它需要相当多的工作。
实践上,这个变化意味着我们可以将这样的代码直接写入 main.swift 文件:
let url = URL(string: "https://hws.dev/readings.json")!
let (data, _) = try await URLSession.shared.data(from: url)
let readings = try JSONDecoder().decode([Double].self, from: data)
print("Found \(readings.count) temperature readings")