【问题标题】:passing an object (self) into extension [duplicate]将对象(自我)传递给扩展[重复]
【发布时间】:2015-11-29 17:03:10
【问题描述】:

我正在尝试编写 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)
            }
        }
    }
}

但这会返回错误:

无法使用“(元素)”类型的参数列表调用“谓词”

问题

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

【问题讨论】:

  • @MartinR 谢谢,我去看看。

标签: swift filter extension-methods


【解决方案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
    }
}

【讨论】:

  • 我刚到这里。非常感谢。
【解决方案2】:

如果对象没有被实例化,它需要一个“自我”。我想它需要是一个静态方法。

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

【讨论】:

  • 我正在尝试取消将元素:[T] 传递到我的扩展中。
猜你喜欢
  • 2016-07-12
  • 2020-06-05
  • 2022-11-02
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
  • 2012-05-27
相关资源
最近更新 更多