我有一个使用return self
不幸的是我得到了类型"结构名称"的不可变值。只有可变成员名称'方法名称'错误。
如何返回结构是可变的?
答案 0 :(得分:8)
你可以很好地改变结构,但你必须使用mutating
注释这些变异方法。
struct SomeStruct {
var x:Int = 0
mutating func increment() {
x++;
}
}
修改强>
让我在这里作一些澄清。结构可以变异:
var structA = SomeStruct()
structA.x // 0
structA.increment()
structA.x // 1
但前提是你宣称它为var
。这不会编译:
let structA = SomeStruct()
// structA.increment() // Compile error
现在,当您执行something.methodReturningStruct().mutatingMethod()
之类的操作时,methodReturningStruct()
实际上将返回原始结构的副本(凭借值类型)。但是由于你没有将它分配给var
,它将被隐含地视为常量(即let
),因此你会得到编译器错误。
你仍然可以做同样的事情,但你只需告诉swift将结构用作var
var structB = something.methodReturningStruct()
structB.mutatingMethod()