銀河鉄道

Swift|asyncとawaitの非同期処理(時間がかかる処理)

サムネイル
async processingasyncand await
非同期処理
async processing

asyncawait

「非同期処理(時間がかかる処理)」をスマートに書くためのキーワード

  • 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

EnglishJapanese
async非同期(時間がかかる処理)
await結果を待つ
Task非同期タスク(並列実行の単位)
concurrency並行処理
closureクロージャ(関数の引数として渡す無名関数)

「待つ理由があるかどうか」

著者

author
月うさぎ

編集後記:
この記事の内容がベストではないかもしれません。