SwiftUIでのtask修飾子は、ビューが表示されるときに非同期操作を開始するために使用されます。taskは、ビューのライフサイクルイベントに基づいて非同期コードを実行することが出来ます。
例えば、ビューが表示された直後にデータをフェッチする場合や、何らかの非同期処理を行いたい場合に非常に便利です。
taskの基本的な使用法
以下は、task修飾子を使用して非同期処理を実行する基本的な例です。
この例では、2つのTextをそれぞれ異なるタスク内で処理して表示しています。
- 1つ目のTextは、起動後メッセージを変化させるTask
- 2つ目は、1秒間隔で数値をカウントしていくTask
import SwiftUI
struct TaskSmp: View {
@State private var data: String = "Loading..."
@State private var count: Int = 0
@State private var flag: Bool = false
var body: some View {
Text(data)
.task {
await loadData()
}
Text("\(count)")
.task {
await countData()
}
}
func loadData() async {
do {
// ここに非同期処理を記述
// 例: 2秒後に表示するメッセージを切り替える
try await Task.sleep(nanoseconds: 2 * 1_000_000_000)
data = "Data loaded successfully!"
} catch {
data = "Failed to load"
}
}
func countData() async {
do {
while(true) {
// 例: 1秒ごとにカウントする
try await Task.sleep(nanoseconds: 1_000_000_000)
count += 1
}
} catch {
count = 0
}
}
}起動後それぞれのタスクにおいてSleepを動作させます。
1つのタスクは、Sleepにより2秒間タスクの動作を停止しており、もう1つは1秒間停止するとともにWhileで繰り返し処理を行います。
上記のコードにより、2つのテキストが非同期で変化するサンプルプログラムになっています。
注意点
まとめ
task修飾子を使うことで、SwiftUIでの非同期処理の管理が簡単になり、コードの可読性と保守性が向上します。
特に、UIの初期化時にデータをロードするなど、ビューの表示に伴う非同期処理を行う場合に有効です。

