无法分配属性:'self'是不可变的,我知道如何修复但需要理解

Lee*_*eem 15 swift

我有一个struct:

public struct MyStruct {
  public var myInt: Int = 0
  ...
}
Run Code Online (Sandbox Code Playgroud)

我有一个扩展MyStruct:

extension MyStruct {

  public func updateValue(newValue: Int) {
     // ERROR: Cannot assigned to property: 'self' is immutable
     self.MyInt = newValue
  }
}
Run Code Online (Sandbox Code Playgroud)

我收到上面显示的错误,我知道我可以通过多种方式修复错误,例如mutating之前添加关键字func.

我在这里不是问如何修复错误,但问为什么swift不允许这种值赋值?除了修复之外我还需要一个解释.

osk*_*rko 30

一个棘手的问题:将其标记为@State。结构是不可变的对象,因此普通属性在其初始值设定项之后无法修改。添加这种标签就可以将其转换为变异属性。

  • 当然!结构是不可变的对象,因此普通属性在其初始值设定项之后无法修改。添加这种标签就可以将其转换为变异属性。 (4认同)

Dix*_*ari 17

struct是一个值类型。对于值类型,只有显式标记为变异的方法才能修改 self的属性,因此在已计算的属性中这是不可能的。

如果将struct更改 为类,则代码可以毫无问题地进行编译。

结构是值类型,这意味着它们在传递时会被复制,因此如果您更改副本,则仅更改该副本,而不更改原始副本,也不会更改周围可能存在的任何其他副本。如果您的结构是不可变的,则所有自动副本如果要更改它,则必须通过使用修改后的数据创建该结构的新实例来有意识地做到这一点。(不是副本)