/* Page prose (zh-Hans) */
"DistributedCodableArguments" = "# 为什么参数和返回值必须是 `Codable`\n\n一次本地方法调用以共享内存中的引用或值来传递参数：被调用方看到的是同一批对象。分布式调用做不到这一点：被调用方可能在另一台机器上，无法访问你的内存。所以每一个参数和每一个返回值都必须被**转成字节、发送过去，并在另一端重建**。\n\n这就是为什么分布式方法的参数和返回类型必须符合 actor 系统的**序列化要求**（对 `ClusterSystem` 以及大多数系统来说，那就是 **`Codable`**）：\n\n```swift\n// A Codable payload can cross the wire; a non-Codable one can't.\nstruct Receipt: Codable, Sendable {\n    let id: UUID\n    let amount: Int\n    let newBalance: Int\n}\n\ndistributed actor Ledger {\n    typealias ActorSystem = ClusterSystem\n\n    private var balance = 0\n\n    distributed func deposit(_ amount: Int) -> Receipt {\n        balance += amount\n        return Receipt(id: UUID(), amount: amount, newBalance: balance)\n    }\n}\n```\n\n`Int` 和 `Receipt` 都是 `Codable` 的，所以它们能踏上旅程。试着传递或返回某个*不*可编码的东西（一个在线的数据库句柄、一个闭包、一个没有 `Codable` 遵循的类），编译器就会拦住你。你根本没办法把一个在线的文件句柄装进信封寄给另一台计算机。\n\n> **这是 [全局 actor 与 Sendable](Global%20Actors%20and%20Sendable.playgroundchapter/Overview) 一章里的 `Sendable`，再往前走了一步。** `Sendable` 问的是：*把这个值交给同一进程里的另一个任务安全吗？* `Codable`（作为分布式要求）问的是更严格的问题：*这个值能被压平成字节并在另一个进程里重建吗？* 每一样跨越 actor 系统边界的东西都需要两者：既能安全移动，*又*能被序列化。像上面 `Receipt` 那样，把你的负载类型一起标记为 `Codable, Sendable`，就是常见的习惯写法。\n\n* callout(想一想): 环顾你自己的某个模型类型。它的哪些属性会乐意地穿过线缆，而哪些（一个在线连接、一张缓存的图片、一个闭包）你不得不留在家里，转而用普通数据来描述？\n\n[上一页](@previous)  |  第 6 / 9 页  |  [下一页: 位置透明](@next)";
