Swift - использование опционально с let

Я быстро научился. При первых впечатлениях я не вижу какой-либо точки объявления константы (без начального сохраненного значения) как необязательного в классе... например

let userName: String?

потому что инициализатор по умолчанию присваивает ему значение nil, и впоследствии он не сможет быть изменен (поскольку его константа).

Как я понимаю, пользовательский инициализатор все еще может присвоить ему значение non-nil, но в этом случае вы просто не объявите его как let userName: String (то есть не необязательным)

Я бы ожидал, что если бы это был избыточный шаблон, который яблоко бы упомянуло об этом, но я не могу видеть, что они... поэтому в каких ситуациях будет использоваться или полезно какое-либо необязательное объявление константы?

Ответ 1

Постоянная, которой необязательно должно быть присвоено значение во время процесса инициализации. Это значение может быть nil или другое значение. После назначения он застревает в этом значении. Ноль - это как "это свойство, преднамеренно оставленное пустым" индикатором, написанное постоянными чернилами.

Скажите, что у вас есть класс, который заполняется данными ответа из сетевого запроса. Некоторые из полей, которые вы возвращаете, могут быть равны нулю или содержать данные.

Вы пишете код, который анализирует ответ с сервера и создает объект ответа. Каждое свойство объекта ответа фиксировано. Он либо содержит данные, если вы получили информацию для этого свойства, либо nil.

В этом случае имеет смысл использовать необязательную константу.

Вы должны написать метод init для вашего объекта ответа, который будет отвечать на сетевой ответ (например, в JSON) и заполнить свойства объекта ответа. Если данный тег в данных JSON отсутствует, вы должны установить это свойство равным нулю. Вы используете константу, потому что значение фиксируется после инициализации объекта ответа. Если он будет равен нулю, он будет бесконечным. Если он содержит значение, он всегда будет содержать это значение и не может быть изменен.

Ответ 2

Если вы помещаете литерал, и вы делаете его необязательным, необязательная часть бесполезна, потому что вы знаете, что number будет 1

let number: Int? = 1

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

var array = ["hello"]
let string: String? = array[1]

// string is nil, so you can do some checking with it

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

Ответ 3

Только необязательная переменная будет автоматически установлена ​​на нуль, если исходное значение не указано


Необязательная константа типа T? НЕ будет автоматически установлен на nil
его необходимо инициализировать вручную со значением типа T или nil

  • Если он не был инициализирован вручную перед использованием, ошибка "константа, используемая до инициализации" будет выбрана

  • Аналогично, если класс имеет необязательное свойство константы без явно, вручную инициализируя его, а также не имеет никакой конструкции, ошибка "класс не имеет инициализаторов" будет выброшена