Как написать быстрые свойства, рассчитанные на более поздней стадии жизненного цикла объекта - PullRequest
1 голос
/ 09 мая 2019

У меня есть быстрый UIViewController, в котором есть массив типов данных (например, страны / личность / банковские реквизиты), извлекаемый из сетевой службы асинхронно в viewDidLoad. Этот массив остается постоянным после извлечения. Следовательно, я хочу применить его, используя ключевое слово let.

У меня нет значения при инициализации UIViewController. Следовательно это дает мне ошибку времени компиляции для не инициализации этого. Если я объявлю это необязательным с '?' Я должен использовать if-let / guard let или необязательную цепочку, чтобы использовать его. Я не хочу загромождать код распаковкой.

Каковы мои варианты объявления переменной как константы, но инициализированной позже при выполнении, не делая ее необязательной переменной?

Ответы [ 2 ]

3 голосов
/ 09 мая 2019

«Константа после загрузки» не является постоянной.Есть некоторый период времени, когда он не установлен, и некоторый момент позже, когда он установлен.Тот факт, что он извлекается из сети, означает, что он может потерпеть неудачу, поэтому ваш код должен с этим справиться (то есть он может никогда не быть установлен).Правильный инструмент для использования здесь - это Необязательный var.

Поскольку должно быть некоторое состояние просмотра, которое обрабатывает «еще нет данных», и другое состояние просмотра, которое обрабатывает «полученные данные», вы можете улучшить свой дизайн.разбивая их на два контроллера представления, и ваш контроллер представления контейнера переключается между ними, когда данные становятся доступными.В этом случае вы можете передать доступные данные в контроллер представления «данные получены» в init, и это может быть let.

2 голосов
/ 09 мая 2019

Какие есть варианты объявления переменной как константы, но инициализированной позже

Нет таких опций. Если у вас нет реального значения свойства во время создания экземпляра, оно должно быть объявлено с var, чтобы вы могли установить его, когда у вас есть реальное значение.

И использование Optional - это общий шаблон, помогающий вашему коду различать до того, как вы получите реальное значение (ноль), и после (не ноль).

Я не хочу загромождать код распаковкой.

Тогда объявите свойство как неявно развернутый Необязательный! Этот вариант использования точно , для чего он хорош.

(Было бы неплохо иметь возможность как-то «заблокировать» свойство после присвоения его окончательного значения, но это не языковая функция Swift. Мне часто хотелось, чтобы это было. lazy имеет такую ​​же проблему.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...