Actorとは
データ競合を防ぐための型。Swift 5.5から導入されたSwift Concurrencyの一部で、並行処理において複数のスレッドから参照されるデータの排他制御を行うことができる仕組み。
使い方
Actorの定義
// classの代わりにactorキーワードを使うだけ
actor Counter {
private var value = 0
func increment() {
// 内部からアクセスするときはawaitは不要
value += 1
}
func getValue() -> Int {
return value
}
}
- actorというキーワードを使って定義を行う。
- これだけでCounterには排他制御の機能をもった状態になる。つまり、Counterに一度にアクセスできるスレッドは一つに限定される。
Actorの利用
let counter = Counter()
Task {
// awaitをつけてアクセス
await counter.increment()
let newValue = await counter.getValue()
print("新しい値: \(newValue)")
}
- actor内のメンバーにアクセスするにはawaitをつける必要がある。これは、もしCounterが他のタスクからアクセスされていた場合、こちらのタスクは順番待ちになり順番が回ってくるまでサスペンド状態になるため。
- actorの内部でアクセスするときはawaitは不要。