Swiftのasync/awaitとエラーハンドリングを徹底解説!TaskとTaskGroupの使い方も初心者向けに紹介
生徒
「Swiftのプログラムで非同期処理っていう言葉を見たんですけど、どういう意味なんですか?」
先生
「非同期処理というのは、時間がかかる作業を待たずに、他の作業を同時に進める仕組みのことです。例えば料理をするときに、お湯を沸かしている間に野菜を切るようなイメージですね。」
生徒
「なるほど!じゃあSwiftで非同期処理をするにはどうしたらいいんですか?」
先生
「Swiftにはasync/awaitという便利な仕組みが用意されています。そして、その中でエラーが発生したときの処理方法もきちんと備わっているんです。」
生徒
「エラー処理っていうのは、予期せぬ失敗に備える方法のことですよね?」
先生
「そうです。今日はasync/awaitとエラーハンドリング、さらに複数のタスクをまとめて扱えるTaskやTaskGroupの基本を見ていきましょう!」
1. Swiftのasync/awaitとは?
Swiftのasync/awaitは、非同期処理をシンプルに書ける機能です。非同期処理とは、ネットワークからデータを取得したり、大きなファイルを読み込んだりと、時間がかかる処理を待たずに進めるための仕組みです。
例えば、オンラインショッピングで「商品を検索しながら、同時にカートを更新する」ような場面を考えるとイメージしやすいでしょう。もし非同期処理がなければ、検索が終わるまでカートの更新が止まってしまいます。しかしasync/awaitを使えば、それぞれの作業を同時進行でき、プログラム全体がスムーズに動きます。
2. async関数とawaitの基本
asyncキーワードを付けると、その関数は非同期処理を行える関数になります。そして、その非同期関数を呼び出すときにはawaitを付けます。これは「処理が終わるのを待つ」という意味です。
func fetchData() async -> String {
return "データ取得完了"
}
Task {
let result = await fetchData()
print(result)
}
データ取得完了
上記の例では、fetchData関数が非同期関数として定義され、Taskの中で呼び出すときにawaitを使っています。
3. Swiftでのエラーハンドリング
プログラムでは「ファイルが見つからない」「インターネットに接続できない」などのエラーが発生することがあります。Swiftではthrowとtry、そしてdo-catch構文を使ってエラー処理をします。
enum NetworkError: Error {
case noConnection
}
func getUserData() async throws -> String {
throw NetworkError.noConnection
}
Task {
do {
let data = try await getUserData()
print(data)
} catch {
print("エラーが発生しました: \(error)")
}
}
エラーが発生しました: noConnection
try awaitを使うことで、非同期処理の中でもエラーを安全に扱えるようになります。
4. Taskを使った並行処理
Taskを使うと、複数の処理を同時に動かすことができます。例えば、画像をダウンロードしながら、別のデータも取得するといったことが可能です。
Task {
async let image = fetchImage()
async let text = fetchText()
let result = await (image, text)
print("画像とテキストの取得完了: \(result)")
}
この例ではasync letを使い、画像とテキストを並行して取得しています。両方が揃ったタイミングで結果をまとめています。
5. TaskGroupで複数のタスクをまとめる
もし複数の処理を一度にまとめたい場合は、TaskGroupを使います。これは「チーム作業」のようなもので、複数の仕事をグループ化して実行し、すべての結果をまとめて扱えます。
await withTaskGroup(of: String.self) { group in
for i in 1...3 {
group.addTask {
return "タスク\(i)完了"
}
}
for await result in group {
print(result)
}
}
タスク1完了
タスク2完了
タスク3完了
ここでは、3つのタスクを同時に動かし、それぞれの結果をまとめて取得しています。大量のデータ処理や並列作業が必要な場合にとても便利です。
6. エラーとTaskGroupの組み合わせ
TaskGroupでもエラーが発生することがあります。その場合はtryやdo-catchを使って処理します。これにより、一部のタスクで失敗しても、他のタスクの結果をうまく扱うことができます。
例えば、「複数のサーバーに同時にデータを取りに行き、一部のサーバーが失敗しても成功したデータを集めたい」といったケースに有効です。
7. まとめて理解するポイント
初心者の方は、まずasync/awaitで非同期処理がどのようにシンプルに書けるのかを理解しましょう。その上で、do-catchを組み合わせてエラー処理を練習すると、実用的なコードが書けるようになります。さらにTaskやTaskGroupを学べば、効率よく複数の処理を同時進行できるようになります。
非同期処理とエラーハンドリングは、Swiftの実践的なアプリ開発に欠かせない重要なスキルです。エラー処理を丁寧に行うことで、ユーザーにとって安心して使えるアプリを作ることができます。