簡體   English   中英

struct didSet 何時被多個變異變量觸發?

[英]When does struct didSet get triggered with multiple mutating variables?

我有一個帶有變異 function 的結構,它會變異多個變量。 我假設結構在每次變量更改時都會發生更改,因為它是一種值類型。 但是,結構的 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()

預期 Output:

int value didSet
mutatingStruct didSet
string value didSet
mutatingStruct didSet

實際 Output:

int value didSet
string value didSet
mutatingStruct didSet

你說的對。 結構是值類型。 因此,即使更改,它們也會被復制!

所以想象一下:

  • 使用原始結構的復制值初始化新實例。
  • intValue獲取它的新值(在復制的實例中)
  • stringValue獲取它的新值(在復制的實例中)
  • mutatingStruct (原始)獲取它的新值(替換為修改后的復制實例

值類型被視為單個值,即使它們具有多個屬性。 所以他們只有在從mutating func返回后才能得到改變。 所以項目符號 1 和項目 2 將更改克隆的實例,但項目符號 3(最后一個)正在更改原始結構。

請記住,Swift 比這更聰明,但它不會! 一遍又一遍地復制所有內容(在幕后)。 但行為方式似乎是那樣的。 僅當您有權訪問相同值類型的先前版本和新版本並且其中一個已更改時,才會執行實際的復制操作。

在 Swift(幕后)中,值類型是引用類型,從調用者的角度來看,它就像一個原始類型!

您可以閱讀此答案的評論以進行更多說明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM