Я только начал изучать Свифт и недавно узнал о
-
"Нормальные" переменные (из-за отсутствия лучшего имени):
ex:
var test1: String
-
"Необязательные" переменные
ex:
var test2: String?
-
"Неявно отключенные опции"
ex:
var test3: String!
-
Ленивые переменные
ex:
lazy var test4: String
Мое понимание таково:
-
Используйте "Необязательные" переменные (?), когда переменная может быть инициализирована или не может быть инициализирована в будущих периодах, начиная с инициализации
-
Используйте "Неявно отключенные опции" (!), когда переменная гарантирована для инициализации
-
Опционы могут быть преобразованы в Implicitly Unwrapped Optionsals через "Принудительная развязка"
ex:
let possibleString: String? = "Hello" println(possibleString!)
-
Используйте "ленивые переменные" , когда нет необходимости в том, чтобы что-то было установлено до инициализации (кажется, они могут использоваться с (?) или (!))
Поэтому мои вопросы:
-
Когда я использую параметр 1 - переменную без? и без!
-
Когда я использую "ленивый"
-
Я читал "ленивый", который часто используется для синглтонов - почему?
У меня больше всего опыта в Java и С++, если это помогает с моим фоном для ответа.
Изменить: Здесь все, что я нашел (Основная проблема: "Нормальный" vs "Неявно отключенные опции" :
- "Нормальные" переменные должны быть инициализированы: (a) В той же строке (b) в той же области до использования (использование означает некоторую операцию с объектом), (c) end от init iff переменная является полем. Примечание: область действия init - это все, что входит в класс класса И не входит в объем функций внутри класса.
- Печать Неявно Unwrapped Необязательный будет печатать "nil", но использование переменных функций приведет к исключению среды выполнения. Между тем, используя (вообще, включая печать) переменную Обычный не позволит программе компилироваться вообще
- Цель использования! over "" (Nothing): (a) Большая снисходительность, так как программа будет компилироваться (и выполняется корректно, если переменная фактически инициализирована) и (b) Позволяет вам не инициализировать все в самом начале. Примечание. Это ошибка времени компиляции, чтобы иметь необработанное поле, если оно является переменной Обычный.