将对象(自身)传递给扩展
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
}
}
我正在尝试编写 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
}
}