Будет напечатано 1110: внешнее изменение задаёт 1010, запись из willSet затем перезаписывается, а didSet добавляет 100.
Какой будет выведен результат? (Задача №23)
Будет напечатано 1110: внешнее изменение задаёт 1010, запись из willSet затем перезаписывается, а didSet добавляет 100.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В данном примере рассматривается структура с наблюдателями свойства. Нужно понять, что произойдёт при попытке изменить значение свойства внутри его willSet и didSet и какой результат будет напечатан в конце.
struct MyStruct {
var value: Int {
willSet {
// Попытка изменить свойство в willSet
self.value += 1
}
didSet {
// Попытка изменить свойство в didSet
self.value += 100
}
}
}
var instance = MyStruct(value: 1000)
instance.value += 10
print(instance.value)
Определите, что будет выведено на консоль после выполнения этого кода.
Ответ
Будет напечатано 1110: внешнее изменение задаёт 1010, запись из willSet затем перезаписывается, а didSet добавляет 100.
При инициализации value = 1000 наблюдатели не вызываются. Операция += 10 вычисляет новое значение 1010. В willSet временная запись 1001 не заменяет ожидающее присваивание 1010, поэтому компилятор может предупредить о бессмысленной записи. После установки нового значения didSet увеличивает его до 1110; прямое изменение свойства в его собственном наблюдателе не запускает этот же цикл наблюдателей заново. Для нормализации значения обычно понятнее отдельный setter, а не модификация в willSet.
Источник: docs.swift.org.