让我们从一些代码段开始
struct DigitS {
var number = 42
init(_ n: Int) {
self.number = n
}
mutating func replace() {
self = DigitS(12) // mutating
}
}
class DigitC {
var number = 42
init(_ n: Int) {
self.number = n
}
func replace() {
self = DigitC(12) //#Cannot assign to value: "self" is immutable
}
}
很长一段时间以来,我对可变、可修改的含义感到非常困惑。以下是我迄今为止的一些理解,如果你能指出它可能存在的所有错误,那就太好了。
谢谢你的时间和帮助
发布于 2017-03-01 18:16:50
使用图像更好地解释处理内存问题,但我将在这里介绍一下:
给出了一个简单的结构,并给出了一个变体:
struct Example {
var text: String
mutating func changeText(to newText: String) {
self.text = newText
}
}
let constantExample = Example(text: "Test") //Makes a section of memory that isn't allowed to change.
constantExample.changeText(to: "Other Test") //This doesn't work because constantExample isn't mutable.
var mutableExample = Example(text: "Test") //Makes a section of memory that is allowed to change.
mutableExample.changeText(to: "Other Test") //This doesn't make a new copy, but rather changes the value in mutableExample's section of memory
如果您要使用您提到的特定情况:
mutating func changeText(to newText: String) {
self = Example(text: "A new text")
}
mutableExample仍然驻留在同一个内存位置,但是您正在手动创建一个全新的示例实例,然后将该数据从该实例复制到mutableExample。
self =
示例中的情况)来更改该实例,但是实例仍然是同一个实例,只是具有不同的值。var variableName = classInstance
时,一旦初始化,引用的位置将保持不变,但是所引用的位置(如果是var)可以更改。b
中的实际值不会更改。发布于 2017-03-01 18:39:20
观察者观察值的变化,类类型变量的值是对象的引用点。要触发属性观察者,必须更改引用。
class Digit {
var number = 12
}
var a = Digit()
var b = Digit() {
didSet{ print("number is set") }
}
b.number = 22 // observer is called
b = a //observer is called here!!
https://stackoverflow.com/questions/42538273
复制相似问题