簡體   English   中英

當您只可以對變量進行突變並且值仍然發生變化時,為什么要使用didSet?

[英]Why use didSet when you can just mutate a variable and the value changes anyway?

我通讀了didSetQ& Apple的《 Property Observers》和其他幾篇文章。 我似乎無法確定的是,如果您在不使用屬性觀察器的情況下更改變量而仍要進行更改,那么在對變量進行更改時使用didSet有什么好處?

方案1:

var someVal = 0

someVal = 10

// someVal now holds 10

方案2:

var someVal: Int = 0{

    didSet{
    }
}

someVal = 10

// again someVal now holds 10

方案3:

var someVal: Int = 0{

    didSet{

       if someVal > oldValue{

            someVal = newValue
       }
    }
}

someVal = 10

// once again someVal holds a value of 10

我在方案3中看到的唯一一件事是,如果不滿足條件,則someVal不會改變。 但是,除了將其添加到didSet中之外,我可以簡單地執行此操作,並且將發生完全相同的事情。

var someVal = 0

var anotherVal = 10

if someVal < anotherValue{
     someVal = anotherValue
}

// once again someVal holds a value of 10

那么其他然后在didSet觀察器中添加條件有什么好處呢?

好吧,它是一個觀察者。 很多時候,您想對更改viewController屬性的值做出反應。 現在,如果您在10個不同的地方修改該屬性, didSet必將相同的代碼復制/粘貼10次不同的時間didSet觀察器將負責該工作。

例如:

var someVal: Int = 0 {
    didSet {
        somePostprocessing()
    }
}


someVal = 10

// a bit later

someVal = 15

// etc.

遠勝於:

var someVal: Int = 0


someVal = 10
somePostprocessing()

// a bit later

someVal = 15
somePostprocessing()

// etc.

在第一種情況下,您可以確保隨時更改值,都將發生后處理。 在第二種情況下,即使我們願意接受復制/粘貼(這不行),如何確保在每次修改值時都不會忘記添加postProcessing?

假設您有一個數組,該表將提供一個tableView ,該數組可以在代碼中的任何位置更改,而無需編寫

 self.tableView.reloadData()

每次更改都不要使用didSet

var someVal: [String] = [] { 
   didSet{ 
    self.tableView.reloadData()
   }
}

這是一個簡單的例子,有很多有用的情況

didSetSwift中的屬性觀察器

didSet{

}

didSet是一個屬性觀察器。 設置特定值時,它用於執行某些任務。

例如:

我認為我們有一個UILabel(與MVC中一樣)

@IBOutlet weak private var someLabel: UILabel!

並且我們在程序模型中的另一個變量中具有它的值,如(MVC)

var someValue: Int = 10

因此,每當我在模型中更新變量時,視圖中的UILabel也應更新。

可以通過didSet作為

var someValue: String = "Hello"{
    didSet{
        someLabel.text = someValue
    }
}

因此,在這里您可以直觀了解didSet didSet的功能。 在上面的示例中,只要模型中變量的值發生更改,視圖也會被更新。

暫無
暫無

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

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