我有一个struct:

public struct MyStruct {
  public var myInt: Int = 0
  ...
}

我有一个MyStruct的分机:

extension MyStruct {

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

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

我在这里不是问如何修正错误,而是问为什么Swift 不允许这种价值分配?除了修理,我还需要一个解释.

推荐答案

structvalue type.对于值类型,只有显式标记为mutating的方法才能修改self的属性,因此在computed属性中不可能这样做.

如果将struct改为class,那么代码编译就不会出现问题.

struct 是值类型,这意味着它们在传递时会被复制.因此,如果你改变了一份拷贝,你只改变了那份拷贝,而不是原件,也不是可能存在的任何其他拷贝.如果您的 struct 是不可变的,那么通过值传递产生的所有自动副本将是相同的.如果你想改变它,你必须有意识地用修改过的数据创建一个新的 struct 实例.(不是副本)

Swift相关问答推荐

TabView中的视频播放器意外播放

在按下按钮动画后执行按钮动作

是否可以将具有关联值的枚举强制转换为其类型与关联值匹配的变量?

TimeZone 背后的目的

使用View()和List()无法显示影子

UIBezierPath() 和 DragGesture:连接点创建角而不是曲线

列表不显示信息

Swift Property Wrappers-Initialization 失败并显示无法将‘Double’类型的值转换为预期的参数类型

如何在 AppDelegate for Cocoa macOS 中创建 mainMenu 和菜单项?

如何让飞机与 RealityKit 中的物体相撞

从 Int 到 String 的属性更改引发 SwiftUI 视图不更新

Swift Components.Url 返回错误的 URL

SwiftUI 中的计时器崩溃屏幕

Swift:连接两个数组而不重复共享后缀/前缀

VStack SwiftUI 中的动态内容高度

swift 3 错误:参数标签 '(_:)' 不匹配任何可用的重载

使 struct 可散列?

两个 Date 对象之间的所有日期 (Swift)

快速延迟加载属性

显示 UIAlertController 的简单 App Delegate 方法(在 Swift 中)