Swift:总是在 inout 上复制?

Chr*_*ver 3 swift swift2

我编写了一个简单的库来序列化模型数据,后来意识到我只是在读取时才对数据进行写入。我能够将问题简化为以下游乐场片段:

class Foo {
    init() { name = "test" }
    var name:String { didSet { print("setting name: \(self.name)") }}
}


func map(inout foo:String) {
    print("writing value: \(foo)")
}

var foo:Foo = Foo()
map(&foo.name)
Run Code Online (Sandbox Code Playgroud)

结果(对我来说)出乎意料:

写入值:测试

设置名称:测试

我重新阅读了有关inout参数的部分,但没有看到明确提及复制语义。我的预感是,如果没有其他代码这样做,编译器期望该值被覆盖,并使用初始值自行执行此操作。

这似乎是预期的,还是编译器错误?以我的拙见,这是不直观的行为。我并不期待任务,除非它源自我的代码 - 但事实并非如此。

为了说明什么是显而易见的,上面的代码片段不需要 inout 参数,但我一直在使用通用接口进行读写。

Kam*_*xom 6

我代表Swift 编译器开发人员Joe Groff在 Twitter 上发布了这篇文章(请参阅回复)。他非常友善地回答了我提到这个问题的推文。

他说:

Inout 具有值-结果语义。didSet 在 inout 末尾接收修改后的值。仅当差异不可观察时(取模无效别名),它才会优化为按引用传递。Swift 书也应该使用此信息进行更新。