无法赋值给属性:函数调用返回不可变值

Swi*_*ter 8 swift

请考虑以下示例.

struct AStruct{
    var i = 0
}

class AClass{
    var i = 0
    var a: A = A(i: 8)

    func aStruct() -> AStruct{
        return a
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试改变类实例的变量,AClass它会成功编译.

var ca = AClass()
ca.a.i = 7
Run Code Online (Sandbox Code Playgroud)

但是如果我试图改变aStruct方法的返回值,编译就会尖叫

ca.aStruct().i = 8 //Compile error. Cannot assign to property: function call returns immutable value.
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下吗.

das*_*ght 12

这是编译器告诉你修改的方法struct是没用的.

这是发生了什么:当你打电话aStruct(),一个副本A回传给你.这个副本是临时的.您可以检查其字段,或将其分配给变量(在这种情况下,您可以访问您的修改).如果编译器允许您对此临时结构进行修改,则无法访问它们.这就是编译器确定这是一个编程错误的原因.


Mer*_*man 7

尝试使用 aclass而不是 a struct,因为它是按引用传递并保留对象,而 astruct是按值传递(创建副本)。


Mad*_*Nik 5

尝试这个。

var aValue = ca.aStruct()
aValue.i = 9
Run Code Online (Sandbox Code Playgroud)

说明

aStruct()实际上返回原始struct的副本a。除非您为其指定一个常量,否则它将隐式地视为一个常量var