Swift iOS - зачем использовать didSet, когда вы можете просто изменить переменную, и значение все равно изменится?
Я прочитал это ТАК, сделал набор вопросов и ответов, Apple's 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, в чем выгода?
3 ответа
Ну, это наблюдатель. Много раз вы хотите отреагировать на изменение значения свойства viewController. Теперь, если вы измените это свойство в 10 разных местах, вам не нужно копировать / вставлять один и тот же код 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 в каждом случае, когда вы изменяете значение?
didSet является наблюдателем свойства в Swift
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. В приведенном выше примере, когда значение переменной в модели изменяется, представление также обновляется.
Предположим, у вас есть массив каналов tableView
этот массив можно изменить в любом месте кода вместо записи
self.tableView.reloadData()
каждое изменение, которое нужно использовать, делает didSet
var someVal: [String] = [] {
didSet{
self.tableView.reloadData()
}
}
это простой пример, есть много полезных случаев