Выполнять код при изменении значения.

В Swift willSet и didSet известны как наблюдатели за свойствами.

Наблюдатель за недвижимостью реагирует на изменения в собственности. Например, этот код печатает новую строку, которая присваивается word:

Вывод:

Assigning a new word: Cat

Наблюдатели за недвижимостью в Swift

Наблюдатели за свойствами предоставляют полезные средства для реагирования на изменения свойств. Они вызываются каждый раз, когда устанавливается значение свойства, даже если новое значение совпадает со старым.

Есть два типа наблюдателей за собственностью: willSet и didSet.

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

Далее вы узнаете, как объявлять наблюдателей свойств и использовать их с полезными примерами.

Как объявить наблюдателей за недвижимостью в Swift

Когда вы создаете новую переменную, у вас есть возможность прикрепить к ней наблюдателей свойств.

Например, давайте добавим didSet обозреватель свойств, который будет печатать новое значение num при каждом его обновлении:

Теперь всякий раз, когда вы меняете значение num:

num = 20

Информация об изменении появится в консоли:

Number changed to 20

Доступ к новым и старым ценностям

При работе с наблюдателями свойств полезно знать старое или новое значение. Здесь пригодятся параметры по умолчанию oldValue и newValue.

Чтобы продемонстрировать, вы можете подумать, что этот фрагмент кода не будет работать:

Но это так. Вывод:

Alert! Tire pressure is about to drop by 20 PSI
Alert! Tire pressure dropped by 20 PSI

Это из-за только что упомянутых параметров по умолчанию oldValue и newValue.

  • В didSet существует параметр по умолчанию для старого значения, называемый oldValue. Это относится к стоимости собственности до изменения.
  • В willSet существует параметр по умолчанию для нового значения, называемый newValue. Это относится к новому значению, которое будет присвоено свойству.

Вы также можете изменить названия параметров по умолчанию.

Например, если вы хотите вместо этого использовать oldNumber и newNumber, просто предоставьте их в качестве параметров наблюдателям свойств:

Вывод:

Alert! Tire pressure is about to drop by 20 PSI
Alert! Tire pressure dropped by 20 PSI

Какой Property Observer мне следует использовать

Если вы хотите предпринять действия непосредственно перед изменением состояния, используйте willSet. Если вам нужно отреагировать после изменения состояния, используйте didSet.

didSet является более распространенным

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

Например, подумайте об обновлении и отображении счета. Сначала счет обновляется, а затем отображается на экране.

willSet тоже полезен

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

Например, SwiftUI иногда использует willSet для обработки анимации: он делает снимок из пользовательского интерфейса прямо перед изменением. После изменения он сравнивает состояния «до» и «после», чтобы узнать, что обновить в пользовательском интерфейсе.

Ограничения для наблюдателей за недвижимостью

В Swift есть некоторые ограничения для наблюдателей за собственностью:

  1. Свойство должно иметь начальное значение (хотя nil в порядке). В противном случае вы не можете назначить для него наблюдателей за свойствами.
  2. Вы не можете использовать наблюдатели свойств с вычисляемыми свойствами (геттеры и сеттеры). Это связано с тем, что вычисляемое свойство не хранит значение, а скорее вычисляет его по запросу. Это нарушает первое ограничение.
  3. Вы не можете использовать наблюдатели свойств с ленивыми переменными. Ленивые переменные - это переменные, которые инициализируются только при первом вызове. Таким образом, ленивая переменная не имеет начального значения, которое также нарушает первое ограничение.
  4. Вы не можете использовать наблюдателей свойств с неизменяемыми значениями (объявленными с помощью let), поскольку они в любом случае не могут быть изменены.

Вывод

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

Вы можете назначить наблюдателей за свойством, реализовав в нем методы didSet и willSet.

Спасибо за чтение, надеюсь, вы найдете это полезным. Удачного кодирования!

Вы можете найти что-то интересное