Рассмотрим следующее:
let numbers: [String?] = ["1", "two", nil]
let intArray: [Int?] = numbers.compactMap {Int($0 ?? "0")}
print(intArray)
Выведен результат [Optional(1), nil, Optional(0)], почему он включает значение nil? Я думал, что они будут отфильтрованы из-за compactMap.
Интересно let intArray: [Int] = numbers.compactMap {Int($0 ?? "0")} работает без проблем.





Это хороший пример того, почему явная аннотация типа иногда усугубляет ситуацию.
Согласно определению compactMap возвращает необязательный массив.
Без аннотации типа
let intArray = numbers.compactMap {Int($0 ?? "0")}
или с правильной аннотацией типа
let intArray : [Int] = numbers.compactMap {Int($0 ?? "0")}
результат
[1, 0]
"1" отображается на 1"two" игнорируетсяnil nil-объединяется с "0" и отображается на 0С плохой/неправильной аннотацией типа [Int?] происходит следующее
"1" отображается на Optional(1)"two" нельзя преобразовать в Int, поэтому вместо игнорирования значения возвращается nilnil nil-объединяется с "0" и отображается на Optional(0)Нет, логика довольно ясна. Заставив компилятор возвращать необязательный тип, вы разрешили compactMap возвращать nil, а не фильтровать вхождения nil. Только не делайте этих нелогичных вещей 😉.
Спасибо за это. Таким образом, казалось бы, нет никакой реальной логики в том, почему он это делает. Необязательные значения становятся необязательными, а nil не отфильтровывается.