如何创建删除空值的Collection扩展?

时间:2018-02-26 09:34:16

标签: ios swift collections null

我有这段代码,但它显示错误:

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]。或任何其他可选数据类型。

我该怎么做?

2 个答案:

答案 0 :(得分:3)

您可以使用flatMap {}代替创建自己的功能。以下是使用示例:

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

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

答案 1 :(得分:0)

您可以继续使用Optional的flatMap行为,如另一个答案所示,但它将是deprecated on the next Swift iteration

如果要将扩展名添加到集合类型,则需要创建一个类型以选中“可选”(如果类型是通用的,则无法扩展集合,如可选)。

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
    }
}