Swift struct didSet什么时候会触发多个变异变量?
我有一个带有变异函数的结构,它变异了多个变量。我假设结构在每次变量更改时都会更改,因为它是一种值类型。但是,在调用mutating func时,只调用一次结构的didSet。有人能解释一下didSet是如何触发的吗Swift struct didSet什么时候会触发多个变异变量?,swift,Swift,我有一个带有变异函数的结构,它变异了多个变量。我假设结构在每次变量更改时都会更改,因为它是一种值类型。但是,在调用mutating func时,只调用一次结构的didSet。有人能解释一下didSet是如何触发的吗 struct MutatingStruct { var intValue = 0 { didSet { print("int value didSet") } } var stringValue = ""
struct MutatingStruct {
var intValue = 0 {
didSet {
print("int value didSet")
}
}
var stringValue = "" {
didSet {
print("string value didSet")
}
}
mutating func setValues() {
intValue += 1
mutateTimesTwo()
}
private mutating func mutateTimesTwo() {
stringValue += "a"
}
}
class SomeClass {
var mutatingStruct = MutatingStruct() {
didSet {
print("mutatingStruct didSet")
}
}
func setHelpStruct() {
mutatingStruct.setValues()
}
}
let someClass = SomeClass()
someClass.setHelpStruct()
预期产出:
int value didSet
mutatingStruct didSet
string value didSet
mutatingStruct didSet
实际产量:
int value didSet
string value didSet
mutatingStruct didSet
你说得对!结构是值类型。所以他们即使在改变的时候也会被复制 想象一下:
- 使用原始结构的复制值初始化新实例
获取它的新值(在复制的实例中)intValue
获取它的新值(在复制的实例中)stringValue
(原始)获取其新值(替换为修改后的复制实例)mutatingStruct
mutating func
返回后才能得到更改。因此,项目符号1和2将更改克隆实例,但项目符号3(最后一个)正在更改原始结构
请记住,斯威夫特比这更聪明,而且它将不会反复复制所有内容(在幕后)。但这样做的方式似乎是这样的。只有当您有权访问相同值类型的旧版本和新版本,并且其中一个已更改时,才会执行实际的复制操作
在Swift(幕后)中,值类型是引用类型,从调用者的角度看,它的行为就像一个基本类型
您可以阅读此答案的注释以了解更多信息。原始结构何时获得其新值?为什么不在更改intValue后立即替换修改后的复制实例?因为您还没有从变异func返回。因此,在每次变异func返回时,原始结构都会获得其新值?但是,setValues()函数调用另一个在setValues()函数返回之前返回的变异函数。原来的结构不应该得到一个新的值吗?是的,它应该得到,它会得到!但不是在原始实例上,在新克隆的实例上!逻辑上是这样的。但请记住,斯威夫特是非常聪明的,它不会!一遍又一遍地(在幕后)复制所有内容。但这样做的方式似乎是这样的。只有当您有权访问相同值类型的旧版本和新版本,并且其中一个已更改时,才会执行实际的复制操作。