Выбор ответа Senior Опционалы обновлено

Сравнение опционалов и двойные опционалы

Вопрос

Что выведет print(dict["b"] == nil) для let dict: [String: Int?] = ["a": 1, "b": nil]?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: false: значение есть, это .some(nil) типа Int?? Сабскрипт словаря возвращает Value?, а Value здесь Int?, значит результат Int??.

Варианты ответа

  1. true: значение по ключу "b" равно nil
  2. false: значение есть, это .some(nil) типа Int??правильный ответ
  3. Ошибка компиляции: опционал в словаре запрещён
  4. true, но с предупреждением компилятора о сравнении Int??

Разбор

Сабскрипт словаря возвращает Value?, а Value здесь Int?, значит результат Int??. Ключ "b" есть, поэтому снаружи .some, а внутри .none. Сравнение с nil проверяет только внешний уровень, и результат false. Хранить опционалы в словаре можно, но это источник ошибок: чтобы удалить ключ, нужен removeValue(forKey:), а присваивание dict["b"] = nil удалит ключ, а не запишет nil.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме