如何在Swift数组上创建一个扩展来替换nil值?



我尝试了以下操作,但我继续得到一个可选数组,即使我使用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 }
    }
}

最新更新