Optional — специальный тип в Swift, который может содержать значение типа T или не содержать значения вообще (nil). Записывается как T?. Позволяет явно указать, что переменная может не иметь значения, и гарантирует проверку на наличие значения на этапе компиляции.
Механизмы извлечения значения:
let str: String? = "hello" if let s = str { print(s) }
guard let s = str else { return } print(s)
let s = str!
(МОЖЕТ привести к runtime crash, если значение nil)
let length = str?.count
??):let value = str ?? "default"
Можно ли присвоить nil переменной типа String, а не String?, и что произойдет?
Ответ:
Нет, переменной обычного типа (String) нельзя присваивать значение nil. Только optional может быть nil, иначе случится ошибка компиляции.
Пример:
var a: String // a = nil // ошибка компиляции: Nil cannot be assigned to type 'String' var b: String? b = nil // OK
История
В приложении при force unwrapping значения, считая что из базы всегда придёт корректный ответ, возникал краш при отсутствии поля. Ошибка решилась дополнительной проверкой через optional binding.
История
При отправке push-уведомлений имя пользователя хранилось в не-optional переменной, что приводило к падению приложения при пустом имени из API. После анализа тип заменили на optional, добавили обработку nil.
История
В проекте при передаче optional значения в функцию, аргумент был объявлен без optional-типа. Возникли скрытые баги и падения. Были внесены изменения: тип параметра стал optional, добавлены проверки наличия значения.