По умолчанию не назначена опция по умолчанию не будет равна нулю

Мое понимание до сих пор. Если вы определяете необязательную переменную без назначения каких-либо значений, компилятор автоматически назначит nil

Фрагменты кода:

A:

var someOptional : Int? //Change to `let` to trigger error 
var aDefaultValue = 42
var theAnswer = someOptional ?? aDefaultValue

Фрагмент кода выше работает отлично, однако, когда я изменил переменную someOptional на константу, компилятор закричал ошибку (см. прилагаемый рисунок ниже)

введите описание изображения здесь

B:

Затем я попробовал аналогичные коды до проблемы.

var someOptional : Int?
print(someOptional)

Тем не менее, он отлично работает с переменной, в то время как с постоянным типом.

введите описание изображения здесь

Вывод:

Если вы определяете константу необязательно, вам нужно назначить нуль явно, если вы имеете в виду это. Поскольку это выглядит бесполезным (зачем вам нужен постоянный параметр с назначенным с помощью nil), если компилятор сделал это для вас автоматически, он может ввести ошибку.

Вопрос:

Почему компилятор предполагает nil для var объявленных опций, но не для let объявленных опций?

Ответ 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)
}