如何创建删除零值的集合的扩展



我有此代码,但显示出错误:

extension Collection {
    func removingOptionals() -> [Element] {
        var result = [Element](); // Error: cannot call value of non-function type '[Self.Element.Type]'
        self.forEach({ (element) in if let el = element { result.append(el); } });
        return result;
    }
}

如果我删除了(),则错误将变为:Expected member name or constructor call after type name

该代码应该通过丢弃所有无空值将[String?]转换为[String]。或任何其他可选数据类型。

我该怎么做?

您可以将flatMap {}使用,而不是创建自己的函数。这是用法的示例:

let strings: [String?] = ["One", nil, "Two"]
print(strings.flatMap { $0 })

结果将是["One", "Two"]

您可以在其他答案中继续使用可选的扁平图行为,但是将在下一个迅速迭代中对其进行弃用。

如果要将扩展名添加到集合类型中,则需要成为一个创建类型来框架(如果类型是通用的,例如可选的(。

protocol OptionalType {
    associatedtype Wrapped
    func map<U>(_ f: (Wrapped) throws -> U) rethrows -> U?
}
extension Optional: OptionalType {}
extension Collection where Iterator.Element: OptionalType {
    func removeNils() -> [Iterator.Element.Wrapped] {
        var result: [Iterator.Element.Wrapped] = []
        result.reserveCapacity(Int(self.count))
        for element in self {
            if let element = element.map({ $0 }) {
                result.append(element)
            }
        }
        return result
    }
}

相关内容

  • 没有找到相关文章

最新更新