見出し画像

SwiftUIでいこう! -Actor(new!)

actorを使うことで非同期のデータ競合を回避ができるようになりました。

例えば、

actor TestActor {
    let name = "aaa"
    var number: Int = 0
}

と宣言して

let testActor = TestActor()

とインスタンス化して使ってみます。

testActor.name

で実行するとしっかり実行されますが、

testActor.number

を実行すると以下のようなエラーが出ます。

error: actor-isolated property 'number' can not be referenced from a non-isolated context
testActor.number

actorで宣言されていることにより、"number"が変数であるうことを認識し値が変化、競合の可能性があるので参照できないとです。

競合、可変データへの同時アクセスを防ぐため

await

をつけて非同期処理ができるようにします。このときにTask{}をつけて実行します。

Task{
  await testActor.number
}

actorで宣言された関数についてはawaitを記述することで、必要な処理を待ってから実行するようになります。つまり実行する処理を隔離して競合を防ぎます。


この記事が気に入ったらサポートをしてみませんか?