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 }}