Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift struct didSet什么时候会触发多个变异变量?_Swift - Fatal编程技术网

Swift struct didSet什么时候会触发多个变异变量?

Swift struct didSet什么时候会触发多个变异变量?,swift,Swift,我有一个带有变异函数的结构,它变异了多个变量。我假设结构在每次变量更改时都会更改,因为它是一种值类型。但是,在调用mutating func时,只调用一次结构的didSet。有人能解释一下didSet是如何触发的吗 struct MutatingStruct { var intValue = 0 { didSet { print("int value didSet") } } var stringValue = ""

我有一个带有变异函数的结构,它变异了多个变量。我假设结构在每次变量更改时都会更改,因为它是一种值类型。但是,在调用mutating func时,只调用一次结构的didSet。有人能解释一下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(幕后)中,值类型是引用类型,从调用者的角度看,它的行为就像一个基本类型


您可以阅读此答案的注释以了解更多信息。

原始结构何时获得其新值?为什么不在更改intValue后立即替换修改后的复制实例?因为您还没有从变异func返回。因此,在每次变异func返回时,原始结构都会获得其新值?但是,setValues()函数调用另一个在setValues()函数返回之前返回的变异函数。原来的结构不应该得到一个新的值吗?是的,它应该得到,它会得到!但不是在原始实例上,在新克隆的实例上!逻辑上是这样的。但请记住,斯威夫特是非常聪明的,它不会!一遍又一遍地(在幕后)复制所有内容。但这样做的方式似乎是这样的。只有当您有权访问相同值类型的旧版本和新版本,并且其中一个已更改时,才会执行实际的复制操作。