/* Page prose (ja) */
"NonSendableProblem" = "# なぜミュータブルなクラスが Sendable でないか、そしてどう修正するか\n\nさて、このプロトコルが捕まえるために存在する、まさにそのケースです。コーヒーバーの日々の注文数のための共有スコアボードを想像してください。クラスにするのは、全員が更新する 1 つのオブジェクトが欲しいからです。\n\n```swift\nfinal class OrderCount {\n    var total = 0\n}\n\nlet orders = OrderCount()\n\n// Hand the shared object to work running off the main actor:\nTask.detached {\n    orders.total += 1   // will not compile in Swift 6\n}\nprint(orders.total)\n```\n\nSwift 6 の言語モードでは、これは**コンパイルできません。** エラーはこうです。*\"non-Sendable type 'OrderCount' of let 'orders' cannot exit main actor-isolated context\"*、そして `OrderCount` は *\"does not conform to the `Sendable` protocol.\"* という注記が付きます。コンパイラは、別の分離ドメインに渡されようとしているミュータブルなクラスを見て、競合が起こりうる*前に*止めます。それがクラシックなモデルからの転換です。[並行処理の落とし穴](Concurrency%20Hazards.playgroundchapter/Overview)の章の data race は、推論しなければならない実行時の驚きでした。ここでは、見逃しようのないコンパイルエラーです。\n\n* callout(試してみよう): 上の `Task.detached` を素の `Task { }` に変えると想像してみましょう。コードはコンパイルできるでしょうか？（できます。次の callout がその理由を説明します。）\n\n* callout(なぜコンパイルできるのか): Playground のページのようなトップレベルのコードは、*main actor 上で*実行されます。素の `Task { }` はその main actor 分離を**継承**するので、オブジェクトはドメインを離れず、コードは実際にコンパイルできます。`Task.detached` は main actor の*外で*実行され、その境界のクロスこそが、ミュータブルなクラスの共有を安全でなくするものです。教訓はこうです。危険はミュータブルな状態がドメインの**間をクロスする**ときに現れるので、そこがコンパイラがトリップワイヤーを仕掛ける場所なのです。\n\nそれを修正する誠実な方法が 3 つあります。\n\n**1. actor にする**（状態がミュータブルで共有されたままでなければならないときに最適）:";
"NonSendableFixes" = "actor は自動的に Sendable です。それが彼らの仕事です。actor を共有するのは常に安全です。なぜなら、actor はすべてのアクセスをシリアル化するからです。\n\n**2. イミュータブルにする**（値が作成後に決して変わらないときに最適）:\n\n```swift\nfinal class FrozenReceipt: Sendable {\n    let id: Int\n    let total: Int\n    init(id: Int, total: Int) {\n        self.id = id\n        self.total = total\n    }\n}\n```\n\n`final` + すべて `let` + Sendable なメンバー = 安全に共有できるクラスです。ミューテートするものが何もないからです。\n\n**3. actor に分離する**（`@MainActor` を含む）:\n\n型をグローバル actor でタグ付けすれば、すべてのアクセスがすでに 1 つのドメインに集約されます。これはまさに、以前 `BalanceDisplay` がやっていたことです。\n\nもう 1 つ、逃げ道もあります。`@unchecked Sendable` です。これは、型が安全だと*あなた自身*が約束し（たとえば、自分の状態をロックで守っているなど）、コンパイラがその言葉を信じるものです。最後の手段として扱ってください。この章の全体の要点は、コンパイラにチェックをさせることであって、それをオフにすることではありません。\n\n[前へ](@previous)  |  8 / 11 ページ  |  [次へ: Sendable クロージャ](@next)";
