Подтвердить что ты не робот

Почему вы используете необязательный тип для константы со значением?

Взгляните на этот оператор из документа Apple:

let optionalInt: Int? = 9

Почему вы использовали Int? как тип для этой константы? Вы знаете, что это не может быть nil, поскольку вы назначаете ему значение 9? Назначение необязательного типа (как я понимаю) состоит в том, чтобы иметь возможность удерживать nil. В этом выражении не нужно optionalInt удерживать nil. Может кто-нибудь объяснить?

4b9b3361

Ответ 1

Я нашел случай, когда вы можете его использовать. Это немного растягивается, но здесь мы идем.

Одна из причин использования let x: Int? = whatever заключается в том, что у вас есть перегруженная функция, где параметры являются разными типами, только если один из них является необязательным. Например:

func doSomething(x: Int)
{
    print("\(x) is an Int")
}

func doSomething(x: Int?)
{
    print("\(x) is an optional")
}

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

let y = 5
doSomething(y) // prints 5 is an Int

let z: Int? = 6
doSomething(z) // prints Optional(6) is an optional

Я еще не видел ничего подобного в реальной жизни.

Что касается документации Apple, это просто простой пример.

Ответ 2

Я думаю, что эта часть документа "Яблоки" призвана просто проиллюстрировать концепцию опций и ничего больше. Они, вероятно, используют let из хорошей практики, чтобы всегда начинать с объявления let свойств/переменных и только переключать их на var, если есть явная необходимость изменить их значения.

Что касается вопроса, почему объявить let foo: Int? = 9, а не только let foo = 9. Ну, я действительно не могу представить, где это понадобится. Даже если какой-либо API ожидает Int?, вы все равно можете передать переменную типа Int для такого API, и Swift будет неявно преобразовывать ее для вас. Возможно, если вы передадите его на общую функцию и хотите, чтобы версия этого типа была Int?, тогда вы захотите это сделать, но это слишком академично, чтобы практическое использование.

Ответ 3

Несколько идей:

Предполагая, что у вас есть метод

func foo(xValue: Int?)->Int? {
  // some logic
}

Возможно, вы хотите определить свою константу, чтобы точно соответствовать определению метода.

let optionalInt: Int? = 9
let fooVal = foo(optionalInt)

Или (изменение первоначального оператора let), значение константы определяется функцией, которая возвращает необязательный

let optionalInt: Int? = foo(nil)