【问题标题】:cannot use mutating member on immutable value: 'XXX' is a 'let' constant不能对不可变值使用变异成员:“XXX”是“让”常量
【发布时间】:2016-10-29 09:55:55
【问题描述】:

我是 swift 的新手。我正在尝试几种方法,但是当尝试提示错误时我失败了,然后发生了另一个错误。我不知道这里到底发生了什么

  public struct ThermometerStruct {
          var temperature: Double = 0.0
      public mutating func registerTemperature(temperature: Double) {
        self.temperature = temperature
      }
    }

    let thermometerStruct = ThermometerStruct()
    thermometerStruct.registerTemperature(temperature : 56.0)

第 14 行第 5 列出现错误:不能在不可变值上使用变异成员:“thermometerStruct”是“让”常量 thermometerStruct.registerTemperature(温度:56.0) ^~~~~~~~~~~~~~~~~

第 13 行第 5 列的信息:将 'let' 更改为 'var' 以使其可变 让 thermometerStruct = ThermometerStruct() ^~~ 变量

【问题讨论】:

  • let 更改为var 时出现什么错误?
  • 由于structs 在 Swift 中是 value 类型,因此结构实例的任何成员属性的任何突变都意味着实例本身的突变。因此,要改变其成员,您需要遵循 Hamish 的建议并将 thermometerStruct 实例从不可变 (let) 更改为可变 (var) 变量。如果ThermometerStruct 改为class,您可以将ThermometerClass 实例标记为不可变(let),但仍然可以改变它的可变成员属性,因为class 类型是reference Swift 中的类型。

标签: swift


【解决方案1】:

错误消息已经告诉您,您需要更改什么。将let 替换为var


structs ar 值类型。这意味着,如果修改了struct 的任何属性,则需要将实例声明为var

当你的struct 有一个方法,即修改结构的一个属性时,这个方法就是mutablemutable 方法只能在您声明为 var 的实例上调用。

【讨论】:

  • 谢谢我只接受这一行的这个问题“当你的struct有一个方法,即修改结构的一个属性时,这个方法是mutablemutable方法只能是在您声明为 var 的实例上调用。"
【解决方案2】:

如果您在 structs 中使用 lazy var 并将其传递给函数或具有对象的 let 引用,则访问 lazy var 隐式地将 mutating 传递给对象。

所以你需要用它制作一个var

struct Test {
  lazy var a: String = ""
}

...

func something(test: Test) {
    let a = test.a //throws compile error

    var test = test
    let a = test.a //OK
}

【讨论】:

    猜你喜欢
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    相关资源
    最近更新 更多