Double??
- сокращенная запись для Optional<Optional<Double>>
, которая является просто вложенной Optional
. Optional
является родовым c enum
, чье значение Wrapped
может фактически быть другим Optional
, и, следовательно, вы можете создавать вложенные Optional
s.
let optional = Optional.some(2)
let nestedOptional = Optional.some(optional)
Тип nestedOptional
здесь Int??
.
Для вашего конкретного примера c, item.first
равен Double??
, поскольку сам item
имеет тип [Double?]
и Array.first
также возвращает Optional
следовательно вы получите вложенный Optional
.
Ваш compactMap
вызов data
ничего не достигает, так как вы вызываете его во внешнем массиве, элементы которого сами являются необязательными массивами. Чтобы отфильтровать элементы nil
из вложенных массивов, вам нужно map
over data
и затем вызвать compactMap
внутри map
.
let nonNilData = data.map { $0.compactMap { $0 } } // [[100, 35.6], [110, 42.56], [120, 48.4], [200]]