Выполнять код при изменении значения.
В 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 есть некоторые ограничения для наблюдателей за собственностью:
- Свойство должно иметь начальное значение (хотя
nil
в порядке). В противном случае вы не можете назначить для него наблюдателей за свойствами. - Вы не можете использовать наблюдатели свойств с вычисляемыми свойствами (геттеры и сеттеры). Это связано с тем, что вычисляемое свойство не хранит значение, а скорее вычисляет его по запросу. Это нарушает первое ограничение.
- Вы не можете использовать наблюдатели свойств с ленивыми переменными. Ленивые переменные - это переменные, которые инициализируются только при первом вызове. Таким образом, ленивая переменная не имеет начального значения, которое также нарушает первое ограничение.
- Вы не можете использовать наблюдателей свойств с неизменяемыми значениями (объявленными с помощью
let
), поскольку они в любом случае не могут быть изменены.
Вывод
Наблюдатели за недвижимостью наблюдают и реагируют на изменения в собственности. Наблюдатель за свойством срабатывает при изменении свойства.
Вы можете назначить наблюдателей за свойством, реализовав в нем методы didSet
и willSet
.
Спасибо за чтение, надеюсь, вы найдете это полезным. Удачного кодирования!