Swift|asyncとawaitの非同期処理(時間がかかる処理)
作成日:2025-10-31
更新日:2025-10-31

async processing
asyncとawait
「非同期処理(時間がかかる処理)」をスマートに書くためのキーワード
async:この関数は時間がかかるかも!と宣言する印await:結果が返ってくるまで「ちょっと待つ」場所
ざっくりイメージ
ふつうの関数は、すぐ終わる処理。
でも、ネット通信とかファイル読み込みは「いつ終わるかわからない」。
そんな「待ち時間あり」の関数を書くときに async を使う。
その関数を呼び出すときに await を付けると、
「終わるまでちゃんと待って、次に進む」という意味になる。
具体例
// データをネットから取得する非同期関数
func fetchUserData() async -> String {
try? await Task.sleep(nanoseconds: 2_000_000_000) // 2秒待つ(ダミー)
return "User data loaded"
}
// 呼び出し側
Task {
let result = await fetchUserData()
print(result)
}ポイント:
asyncが付いた関数は、普通の関数からは直接呼べない- だから
Task { ... }ブロックの中など、「非同期環境」で呼ぶ必要がある awaitは「この処理が終わるまで次に進まない」という意味
もし await を使わなかったら?
Swiftはコンパイルエラー出す。async 関数は「結果がすぐ返ってくる保証がない」から、await なしでは呼び出せないようにして安全を守ってる。
参考:昔の書き方との違い
昔はこう書いてた:
fetchUserData { result in
print(result)
}つまり「クロージャ(コールバック地獄)」。async/await はこのネスト地獄を解消し、
「同期処理みたいに読める非同期処理」を実現してくれる
用語整理
| 用語 | 意味 | 例えるなら |
|---|---|---|
| async | 「ちょっと時間かかる」という宣言 | 行列に並ぶ前に「待つよ」と宣言する |
| await | 「終わるまで待っとこう」 | 並んでる間にスマホ見て待ってる感じ |
| Task | 非同期ワールドへの入口 | 並ぶ列そのものを作る感じ |
よくあるエラー|No ‘async’ operations occur within ‘await’ expression
awaitしてるけど、その中に実際の非同期処理がないよ?
Swiftでは、await は “asyncな関数の結果を待つ” ためのキーワード。
しかし、もしその後に続く処理がただの同期関数だったら…
Swift「待つものがないのに待ってどうするの!」
っていうエラーになる。それがこのメッセージ。
エラーの例
ダメな例
func normalFunction() -> String {
return "Hello"
}
Task {
let message = await normalFunction() // ❌ エラー
print(message)
}Swiftの言い分:
“
normalFunction()は普通の関数だよね。asyncじゃないからawaitは不要!”
正しい書き方
func asyncFunction() async -> String {
return "Hello"
}
Task {
let message = await asyncFunction() // ✅ OK!
print(message)
}ここでようやく、await が “async関数をちゃんと待ってる” 状態になる。
よくある落とし穴
| パターン | 対処 |
|---|---|
await 付けたけど関数が async じゃない | await を外す or 関数を async にする |
async 関数内で await を書いてるけど、呼び先が同期関数 | await を外す |
非同期関数を await なしで呼ぶ | await を付ける |
まとめ
awaitは何でもかんでも“待つ”のではない
“asyncなものを待つ”
“ただの処理”を待っても意味ない。
「待つ理由があるかどうか」 をSwiftがちゃんと見張ってる
Vocabulary List
| English | Japanese |
|---|---|
| async | 非同期(時間がかかる処理) |
| await | 結果を待つ |
| Task | 非同期タスク(並列実行の単位) |
| concurrency | 並行処理 |
| closure | クロージャ(関数の引数として渡す無名関数) |
2025-10-31
編集後記:
この記事の内容がベストではないかもしれません。