我尝试编写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)传递到我的扩展中?更深入的解释是非常受欢迎的。
答案 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]