将对象(自身)传递给扩展

passing an object (self) into extension

我正在尝试编写 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: [=12=]) }

我试过的

显然,我想要实现的是这样的:

extension Array {

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

但是这个returns一个错误:

Cannot invoke 'predicate' with an argument list of type '(Element)'

问题

如何在不对其进行参数化的情况下将对象(在本例中为坐标)传递到我的扩展中?欢迎更深入的解释。

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

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

数组的元素已有占位符类型: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
    }
}