Ответ 1
Да, это правильно
Необязательная переменная не требуется инициализировать вручную. Если вы прочитали его перед заполнением, оно содержит nil
.
От Apple docs
Если вы определяете необязательную переменную без указания значения по умолчанию, переменная автоматически устанавливается на нуль для вас [...]
С другой стороны, компилятор заставляет вас вручную инициализировать необязательную константу (let
), прежде чем вы сможете ее прочитать.
В отличие от переменной значение константы не может быть изменено после ее установки. Попытка сделать это сообщается как ошибка при компиляции кода [...]
Почему?
Константа может быть записана только один раз. Это не обязательно должно происходить в той же строке, что и инициализировано, но это должно произойти до того, как вы его прочитали.
например. этот код работает отлично
let num: Int?
num = 1
print(num)
Однако, если компилятор разместил временное значение nil
внутри num
, тогда константа была бы написана дважды. Что противоречит концепции константы.
let num: Int?
print(num) // nil ??? <- this can't work!
num = 1
print(num) // 1
Другой пример
Этот фрагмент кода отлично работает
func printArea(width: Int?, height:Int?) {
let area: Int?
if let width = width, height = height {
area = width * height
} else {
area = nil
}
print(area)
}
Опять же, если компилятор разместил временное значение nil
внутри area
, тогда...
func printArea(width: Int?, height:Int?) {
let area: Int?
print(area) // not possible! area is going to change in a moment
if let width = width, height = height {
area = width * height
} else {
area = nil
}
print(area)
}