Это распространенный шаблон или метод в различных языках программирования, когда мы хотим выполнить какое-то действие при изменении значения. Обозреватели свойств используются в Swift, когда мы хотим выполнить действие при изменении значения свойства. Даже если новое значение похоже на старое, наблюдатели свойств будут отвечать каждый раз, когда их вызывают.

Наблюдатели свойств можно определить двумя способами:

willSet: выполняется непосредственно перед установкой нового значения свойства.

didSet: запускается сразу после установки нового значения свойства.

В нашем коде мы можем использовать оба наблюдателя willSet и didSet или только один из них. willSet редко используется в нашем коде, но didSet очень часто встречается в языке программирования Swift.

Чтобы продемонстрировать, как функционируют наблюдатели свойств, в этом примере мы реализуем структуру Player с двумя сохраненными свойствами.

struct Player {
  var level: Int
  var score: Int {
    willSet {
      print("New score : \(newValue), current score: \(score)")
    }
    didSet {
      print("Previous score: \(oldValue), current score: \(score)")
    }
  }
}
var player = Player(level: 1, score: 0)
player.score = 20
player.score = 40

В этой ситуации мы хотим напечатать оператор до и после изменения значения свойства score. Мы используем наблюдатель willSet для вывода нового значения оценки с именем по умолчанию newValue и текущей оценкой.

Точно так же наблюдатель didSet печатает предыдущую оценку и текущую оценку с именем по умолчанию oldValue. Наконец, мы получили следующий результат в консоли, и мы заметили, что наблюдатели willSet и didSet вызываются каждый раз, когда значение оценки изменяется.

New score : 20, current score: 0
Previous score: 0, current score: 20
New score : 40, current score: 20
Previous score: 20, current score: 40

Вы можете установить свои собственные имена в наблюдателях willSet и didSet, если вы не хотите использовать имена по умолчанию для oldValue и newValue, чтобы сделать ваш код чище и читабельнее.

var score: Int {
  willSet(newScore) {
    print("New score : \(newScore)")
  }
  didSet(previousScore) {
    print("Previous score: \(previousScore)")
  }
}

Заключение

Наблюдатели свойств с willSet и didSet предлагают мощный способ отслеживания изменений значения свойства без необходимости написания дополнительного кода или абстракции.

Чтобы найти новейшие советы и рекомендации по разработке iOS, Xcode и Swift, посетите https://www.gurjit.co.

Спасибо!