Swiftのasync/awaitと関数の使い方をやさしく解説!初心者でも非同期処理が理解できる
生徒
「Swiftで非同期処理を使いたいんですが、asyncとawaitってどうやって関数と組み合わせればいいんですか?」
先生
「とても大事なポイントですね!Swiftでは、非同期処理をより読みやすく、書きやすくするためにasyncとawaitというキーワードが導入されました。」
生徒
「でも、今ひとつイメージがわかなくて…。普通の関数とどう違うんですか?」
先生
「それでは、まずは基本の使い方からゆっくり見ていきましょう!」
1. Swiftのasync/awaitとは?
async(アシンク)とawait(アウェイト)は、Swiftで非同期処理を簡単に書くためのキーワードです。「非同期処理」とは、何か時間がかかる作業(ネットからデータを取ってくるなど)をしている間に、他の処理を止めずに同時に進めることです。
従来のSwiftではcompletionHandlerという形で非同期処理を書いていましたが、読みづらく、ネスト(入れ子)が深くなることも多かったです。
そこで登場したのがasyncとawait。まるで「普通の関数」のように、処理の流れを読みやすく書けるのが特徴です。
2. async関数の基本的な書き方
async関数は、非同期処理を含む関数のことです。定義するには、関数名の前にasyncをつけます。
func fetchMessage() async -> String {
return "こんにちは、非同期の世界!"
}
このように書くことで、戻り値の型(ここではString)を持つ非同期関数が作れます。
3. awaitの使い方とは?
awaitは、async関数を呼び出すときに使います。「この関数の処理が終わるまで待つ」という意味を持ちます。awaitを使うことで、まるで同期処理のように、順序を守ったコードが書けるようになります。
func showMessage() async {
let message = await fetchMessage()
print(message)
}
ここではfetchMessage()という非同期関数をawaitで呼び出し、その結果をmessageという変数に入れています。
4. 実行はTask内で行う
async関数は、そのままでは直接呼び出すことができません。非同期処理のための「コンテナ」のような役割をするTaskの中で呼び出す必要があります。
Task {
await showMessage()
}
これで非同期関数showMessage()が実行されます。Swiftのプログラムでは、このようにTaskを使って非同期処理のスタート地点を作ります。
5. 時間のかかる処理を再現してみよう
非同期処理の代表的な例は、サーバーからデータを取得することですが、ここでは簡単に、Task.sleepを使って2秒待つような処理を作ってみましょう。
func waitAndPrint() async {
print("処理を開始します")
try? await Task.sleep(nanoseconds: 2_000_000_000)
print("2秒待ちました")
}
これをTaskで呼び出せば、画面に「処理を開始します」と表示されたあと、2秒待ってから「2秒待ちました」と表示されます。
Task {
await waitAndPrint()
}
処理を開始します
(2秒待つ)
2秒待ちました
6. 非同期処理を使う場面とは?
非同期処理は、次のような場面でよく使われます:
- インターネットからデータを取得するとき(APIアクセスなど)
- 画像やファイルの読み込み処理
- 音声や動画の再生準備
- ゲームなどで時間のかかる演出処理
これらの処理は、完了するまでに時間がかかることがあります。もし全部を「同期的」にやってしまうと、アプリが固まってしまう原因になります。非同期処理を使えば、画面を止めずに裏で処理を進めることができます。
7. async/awaitと関数のポイン
この記事では、Swiftで非同期処理を扱うときに使うasyncとawaitの使い方を学びました。非同期関数の定義、呼び出し、Taskによる実行など、基本的な部分を丁寧に説明しました。
Swiftの非同期処理は、見た目がシンプルなだけでなく、エラー処理やデータ処理と組み合わせることで、さらにパワフルな書き方ができるようになります。