Выбор ответа Senior Опционалы обновлено
Сравнение опционалов и двойные опционалы
Вопрос
Что выведет print(dict["b"] == nil) для let dict: [String: Int?] = ["a": 1, "b": nil]?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: false: значение есть, это .some(nil) типа Int?? Сабскрипт словаря возвращает Value?, а Value здесь Int?, значит результат Int??.
Варианты ответа
true: значение по ключу"b"равноnilfalse: значение есть, это.some(nil)типаInt??правильный ответ- Ошибка компиляции: опционал в словаре запрещён
true, но с предупреждением компилятора о сравненииInt??
Разбор
Сабскрипт словаря возвращает Value?, а Value здесь Int?, значит результат Int??. Ключ "b" есть, поэтому снаружи .some, а внутри .none. Сравнение с nil проверяет только внешний уровень, и результат false. Хранить опционалы в словаре можно, но это источник ошибок: чтобы удалить ключ, нужен removeValue(forKey:), а присваивание dict["b"] = nil удалит ключ, а не запишет nil.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.