将对象(self)传递给扩展

时间:2015-11-29 17:03:11

标签: swift filter extension-methods

我尝试编写Swifts .filter函数并遇到了一些困惑。我基本上试图修改这个功能:

func anotherFilter<T>(elements: [T], predicate: (T) -> Bool) -> [T] {
    var filteredArray = [T]()
    for element in elements {
        if predicate(element) {
            filteredArray += [element]
        }
    }
    return filteredArray
}

加入扩展程序:

extension Array {
    func anotherFilter<T>(elements: [T], predicate: (T) -> Bool) -> [T] {
        var filteredArray = [T]()
        for element in elements {
            if predicate(element) {
                filteredArray += [element]
            }
        }
        return filteredArray
    }
}

当然这个版本的扩展程序有效,但它要求你传递一个没有意义的对象:

self.coords.anotherFilter (coords) { self.someOperation(coords, op: $0) }

我尝试过的事情

显然,我想要达到的目标是:

extension Array {

    func anotherFilter <T>(predicate: (T) -> Bool) -> [T] {
        var filteredArray = [T]()
        for item in self {
            if predicate(item) {
                filteredArray.append(item)
            }
        }
    }
}

但这会返回错误:

  

无法调用&#39;谓词&#39;使用类型&#39;(元素)&#39;

的参数列表

问题

如何在不参数化的情况下将对象(在本例中为coords)传递到我的扩展中?更深入的解释是非常受欢迎的。

2 个答案:

答案 0 :(得分:1)

Array已经为其元素添加了占位符类型:Element。您的通用参数T正是该占位符类型,因此您只需使用Element

extension Array {
    func anotherFilter(predicate: (Element) -> Bool) -> [Element] {
        var filteredArray = [Element]()
        for item in self where predicate(item) {
            filteredArray.append(item)
        }
        return filteredArray
    }
}

答案 1 :(得分:0)

如果未实例化对象,则需要“self”。我想它需要是一个静态的方法。

static func anotherFilter<T>(elements: [T], predicate: (T) -> Bool) -> [T]