Skip to content

actorの値への隔離

actor 型の書き方については、アクターモデルの導入で扱いました。

actor型はインスランスごとにisolation domainができます。Inventory() を二回呼べば、それぞれの stock は別のisolation domainに隔離されます。

actorの隔離は、メソッドごとに外すことも可能です。隔離したくない状態や関数はnonisolated修飾子をつけることによりnon-isolatedに変更することができます。

extension Inventory {
nonisolated func label() -> String {
"在庫"
}
}

このnon-isolatedにしたlabel()の中では、隔離領域の中のstockにアクセスすることはできません。

また、関数の引数としてactor型を受け取る場合場合、 isolated修飾子をつけることで引数で受け取ったアクターインスタンスのisolation domainの中で関数の処理を行うことができます。これは、actor型の中に関数を書いているのと同じことをいみします。

func purchase(from inventory: isolated Inventory) -> Int {
inventory.stock = inventory.stock - 1
return inventory.stock
}

isolated を付けない関数は、stock へ代入できません。

func purchase(from inventory: Inventory) -> Int {
inventory.stock = inventory.stock - 1 // コンパイルエラー
return inventory.stock
}

呼び出し方も、actor型の中に定義した関数と同じです。すでにそのアクターインスタンスのisolation domainの中にいるため、隔離された状態、関数をawait なしで呼べます。そして、この関数を呼び出す側はawaitをつけて呼び出す必要があります。

extension Inventory {
func purchaseFromSelfAndFriend(friend: Inventory) async -> Int {
let mine = purchase(from: self)
let theirs = await purchase(from: friend)
return mine + theirs
}
}