Что такое Optional в Swift и как его использовать
Что проверяют
Понимаете ли вы, что это тип-перечисление, а не «может быть nil», и умеете ли разворачивать его без принудительного оператора.
Как отвечать
Optional<T> это перечисление с двумя случаями: .some(T) и .none. Запись String? это сокращение. Смысл в том, что отсутствие значения выражено в системе типов: компилятор не даст обратиться к содержимому, не проверив.
Способы развернуть:
- безопасное связывание:
if let name = user.name { ... }, с Swift 5.7 короткая формаif let name; - ранний выход:
guard let name = user.name else { return }, значение остаётся видимым дальше; - значение по умолчанию:
let name = user.name ?? "Аноним"; - опциональная цепочка:
user.profile?.avatar?.urlвозвращаетnil, как только что-то в цепочке пусто; - принудительное развёртывание
user.name!роняет приложение наnil. Допустимо только там, где отсутствие значения это ошибка программиста, а не данных.
Отдельно про try? и as?: оба возвращают опционал, потому что операция может не удаться.
Про неявно развёрнутые опционалы (String!): нужны для @IBOutlet и двухэтапной инициализации, в обычном коде их избегают, потому что они возвращают ту же неопределённость, только без предупреждения компилятора.
Полезно упомянуть: опционал можно преобразовать функционально через map и flatMap, не разворачивая.
Где спотыкаются
Ставят ! везде, где компилятор ругается, и превращают систему типов в декорацию.
Не различают nil и пустую строку или ноль.
Не знают про guard let и городят лесенку из if let.
Считают Optional особым синтаксисом, а не обычным перечислением из стандартной библиотеки.