gpt4 book ai didi

swift - struct didSet 什么时候被多个变异变量触发?

转载 作者:行者123 更新时间:2023-11-28 05:35:21 25 4
gpt4 key购买 nike

我有一个带有变异函数的结构,可以变异多个变量。我假设结构在每次变量更改时都会更改,因为它是一种值类型。但是,结构的 didSet 只在调用 mutating func 时被调用一次。有人可以向我解释 didSet 是如何被触发的吗?

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 比这更聪明,它不会不会!一遍又一遍地(在幕后)复制所有内容。但是以这种方式行事似乎是这样。仅当您有权访问相同值类型的旧版本和新版本并且其中一个发生更改时,才会执行实际的复制操作。

在 Swift 中(幕后),值类型是引用类型,从调用者的角度来看,它就像原始类型一样!

您可以阅读此答案的评论以获得更多说明。

关于swift - struct didSet 什么时候被多个变异变量触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58867470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com