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了吗?