async/await
の Proposal が Accept され、 Swift に async/await
が導入されることが決定しました。本リポジトリには、そんな Swift の async/await
を使ったコードを実務でどのように使うのか、一足早く練習できる問題を作成しました。
本練習問題は Web API から User
の JSON を取得し、それをデコードして返す非同期処理を題材にしています。
struct User: Identifiable, Codable {
typealias ID = Int
let id: ID
var name: String
var thumbnailURL: URL
}
問題は 01 - 07 まであり、それぞれ非同期処理のエラーハンドリングや並行処理など、実務で直面しそうなケースを取り上げています(ただし、 どの問題の解答も数行程度のコードで書けます )。 01 - 03 については A と B があり、同じ処理を A ではコールバックで、 B では async/await
を使ってコードを書く問題になっています。そのため、これまでコールバックで書いていたコードがどのように async/await
と対応するのか、どのように変化するのかを対比して理解することができます。
なお、本リポジトリは async/await
自体の説明を含みませんが、 本練習問題を用いて開催されたハンズオンの録画動画( async/await
自体の説明や問題の解説などを含みます) およびスライドを下記 URL からご覧いただけます。スライドだけで説明がわかるようにはできていないので、動画の視聴をオススメします。
- ハンズオンの動画: https://www.youtube.com/watch?v=OZN_YFZy770&t=1467
- スライド: https://speakerdeck.com/koher/await
async/await
を使ったコードは Swift 5.3 環境で実行することはできません。しかし、すでに apple/swift の main
ブランチにマージされているため、最新ビルドの Swift であれば利用することができます。 Swift Fiddle を使えば、ブラウザ上で手軽に最新ビルドの Swift を用いて async/await
を含むコードをコンパイル・実行することができます (ドロップダウンリストから nightly-main
を選択する必要があります。上記ハンズオンも Swift Fiddle を用いて行われました)。
問題 | 解答例 | テーマ |
---|---|---|
01A, 01B | 01A, 01B | async/await (エラーハンドリングなし) |
02A, 02B | 02A, 02B | async/await (エラーハンドリングあり) |
03A, 03B | 03A, 03B | async/await (連続した複数の処理) |
04 | 04 | async let (並行処理) |
05 | 05 | @asyncHandler ( async の起点) |
06 | 06 | Task.Handle とキャンセル |
07 | 07 | Continuation (コールバックからの変換) |