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

Swift 无法分配给属性:函数调用返回不可变值,swift,Swift,考虑下面的例子 struct AStruct{ var i = 0 } class AClass{ var i = 0 var a: A = A(i: 8) func aStruct() -> AStruct{ return a } } 如果我尝试对类AClass的实例的变量进行变异,它将成功编译 var ca = AClass() ca.a.i = 7 但是如果我尝试改变aStruct方法的返回值,编译会发出尖叫声 ca.a

考虑下面的例子

struct AStruct{
    var i = 0
}

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

    func aStruct() -> AStruct{
        return a
    }
}
如果我尝试对类
AClass
的实例的变量进行变异,它将成功编译

var ca = AClass()
ca.a.i = 7
但是如果我尝试改变
aStruct
方法的返回值,编译会发出尖叫声

ca.aStruct().i = 8 //Compile error. Cannot assign to property: function call returns immutable value.
有人能解释一下吗。

试试这个

var aValue = ca.aStruct()
aValue.i = 9
解释


aStruct()
实际上返回原始结构的副本
a
。除非你给它赋值一个
var

这是编译器告诉你修改
struct
是无用的,否则它将被隐式地当作一个常量


下面是发生的情况:当您调用
aStruct()
时,会将
a
的副本传递给您。这份是临时的。您可以检查其字段,或将其分配给变量(在这种情况下,您可以重新访问修改)。如果编译器允许您对这个临时结构进行修改,那么您将无法重新访问它们。这就是为什么编译器确定这是一个编程错误。

尝试使用
类而不是
结构,因为它通过引用传递并保留在对象上,而
结构通过值传递(创建了副本)。

现在得到了它。隐式地将其视为常量是我错过的一点。在这种情况下,
struct
是无用的。这里的“A”是什么类型?你把AStruct错拼成A了吗?