Какой будет выведен результат? (Задача №23)

Будет напечатано 1110: внешнее изменение задаёт 1010, запись из willSet затем перезаписывается, а didSet добавляет 100.

Короткий ответ

Что ответить на собеседовании

Будет напечатано 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее