Ваши @IBOutlet
свойства представлены вашим подклассом UIViewController
.
Сказать, что «Swift хочет инициализировать все свойства в фазе инициализации», немного упрощает.
Правила инициализации Swift гласят, что все свойства, представленные подклассом, должны быть инициализированы перед вызовом инициализатора суперкласса, и компилятор Swift должен иметь возможность «видеть» эту инициализацию; должно быть явное присваивание. Это «Проверка безопасности 1»: -
Проверка безопасности 1
Назначенный инициализатор должен убедиться, что все свойства, представленные его классом, инициализированы до его делегирования инициализатору суперкласса.
Почти во всех случаях, когда вы используете сцену XIB или раскадровку, вы не переопределяете init(coder:)
, поэтому компилятор может определить, что вы не указали явно значения для этих свойств.
Если бы вы переопределили инициализаторы и присвоили значения (или даже если вы просто присвоили значения по умолчанию при объявлении свойств), вы могли бы сделать их обычными свойствами, а не неявно развернутыми опциональными параметрами, но это было бы немного бессмысленно, поскольку вы бы почти сразу перезаписывают эти значения при загрузке XIB.
Неявно развернутый необязательный параметр не говорит: «На этапе инициализации я не могу вас инициализировать»; Это больше похоже на «Я знаю, что похоже, что это не инициализируется, но во время выполнения это будет. Поверьте мне» (Строго говоря, это просто объявление необязательного значения, которое может быть nil
, поэтому компилятор не не жалуйтесь, что оно не инициализировано, но неявно принудительно разворачивает свойство всякий раз, когда на него ссылаются - отсюда и название «неявно развернутый необязательный»).
Это работает в течение @IBOutlet
с, поскольку в процессе загрузки используется Код значения ключа для назначения значений во время выполнения.
По этой причине, если вы удалите @IBOutlet
, но забудете обновить XIB / Storyboard, вы получите исключение времени выполнения, сообщающее, что ваш класс "не соответствует ключу / значению для xxx".
Использование неявно развернутых опций таким образом, как правило, считается приемлемым, так как вы довольно быстро узнаете, возникла ли у вас проблема с подключением во время тестирования (поскольку ваше приложение вылетает с «неожиданно нулевым значением»), и это экономит много условного развертывания.