Swift async await 
本文描述了使用 Swift 编写应用时, 如何定义异步函数, 如何调用异步函数, 如何将回调函数
基础用法 
await 只能在 async 函数中或者 Task 中被调用.
- 定义异步函数
swift
func fetchImage() async {
  await loader.downloadImage()
}- 使用异步函数
swift
Button("Download with Async") {
  Task {
      await vm.fetchImage()
  }
}取消异步函数 
swift
var body: some View {
    VStack {
        if let image = vm.image {
            Image(uiImage: image)
        }
    }
    .onAppear{
        fetchImageTask = Task {
            await vm.fetchImage()
        }
    }
    .onDisappear {
        fetchImageTask?.cancel()
    }
}将回调函数转化为异步函数 
可以使用 withCheckedContinuation 函数将回调函数(Completion handler)封装成异步函数(Async function)
swift
// 会抛出错误的调用 withCheckedThrowingContinuation
// 不会抛出错误的调用 withCheckedContinuation
private func readImageData(item: PhotosPickerItem) async throws -> Data {
    return try await withCheckedThrowingContinuation { continuation in
        item.loadTransferable(type: Data.self) { result in
            switch result {
            case .success(let imageData):
                if let imageData {
                    continuation.resume(returning: imageData)
                } else {
                    continuation.resume(throwing: PickerError.noData)
                }
            case .failure(let error):
                continuation.resume(throwing: error)
            }
        }
    }
}