я только начал изучать Свифта и недавно узнал оКогда использовать?,!, None или Lazy?
"Нормальные" переменные (за неимением лучшего названия):
например:
var test1: String
"Дополнительно" переменные
ex:
var test2: String?
"Косвенно Незавернутые Optionals"
например:
var test3: String!
Ленивые переменные
например:
lazy var test4: String
Мое понимание таково:
Использование «Дополнительно» переменные (?), Когда переменная может или не может быть инициализирован в точках в будущем, начиная с инициализации
Использование «Косвенно Незавернутые Optionals» (!), Когда переменная гарантированно будет инициализирован
Optionals могут быть преобразованы в неявном распакованных OPTIONALS с помощью «Принудительный Unwrapping»
например:
let possibleString: String? = "Hello" println(possibleString!)
Использование «Ленивые переменные», когда нет необходимости что-то не должен быть установлен до инициализации (кажется, они могут быть использованы с() или()?!)
Поэтому мои вопросы:
Когда я использую вариант 1 - переменная, не? и без!
Когда я использую «ленивый»
Я читал «ленивым» часто используется для singletons - почему?
У меня больше всего опыта в Java и C++, если это помогает с моим фоном для ответа.
Edit: Вот все, что я нашел (Основной вопрос был "Normal" против "имплицитно распакованных OPTIONALS":
- переменные "Нормальные" должны быть инициализированы: (а) На (b) в той же области до использования (использование означает некоторую операцию с объектом), (c) к концу инициализации iff переменная является полем. Примечание: Объем init - это все в рамках класса И не входит в сферу функциональности в классе.
- Печать Неявно Unwrapped Необязательно будет печатать «nil», но использование функций переменной вызовет исключение во время выполнения. Между тем, используя (вообще, включая печать) переменную Normal не позволяет программе компилироваться вообще
- Цель использования! over "" (Nothing): (a) Большая снисходительность, так как программа будет компилироваться (и выполняется корректно, если переменная фактически инициализирована) и (b) Позволяет вам не инициализировать все в самом начале. Примечание: Это ошибка времени компиляции, чтобы иметь любое необъявленное поле, если оно является переменной Normal.
Ah okay, когда я буду использовать var test1: String // без? и нет ! ? – AeonNeo
Вы бы написали несколько тысяч строк кода Swift и в конце концов выяснили это. – gnasher729
@AeonNeo, это зависит от вашего дизайна. Если значение «нет значения» для свойства является частью потока, используйте «?». Если он почти всегда будет иметь значение, кроме некоторых «особых» периодов, когда он не будет, но в течение этих периодов он не будет доступен, используйте «!». В противном случае придерживаться «нормального» свойства. И вообще, если вы можете пойти без использования опций, идите без них. Иногда они могут быть довольно сложными (особенно неявно разворачиваемые). – courteouselk