我尝试了以下操作,但我继续得到一个可选数组,即使我使用compactMap,我也不想要。
let numbers: [Int?] = [2, 4, 5, nil, 8]
extension Array where Element: Equatable {
func replacingNil(with element: Element) -> [Element] {
self.compactMap { $0 == nil ? element : $0 }
}
}
print(numbers.replaceNil(with: 0))
这里使用compactMap
是不正确的。compactMap
将[T]
转换为另一个[U]
- 映射函数允许返回可选((T) -> U?
),并且它删除了该函数返回nil的任何元素。这个属性可以用来从[T?]
中删除nil
s,并通过传递{ $0 }
来获得[T]
,但这不是你在这种情况下试图对[T?]
做的。
这里你想要的是把[T?]
变成[T]
,你有一个一对一的映射,这可以用map
来完成,像这样:
extension Sequence {
func replacingNil<T>(with element: T) -> [T] where Element == T? {
self.map { $0 ?? element }
}
}