我已将此扩展添加到Array
extension Array {
func each(call: (element: Element, idx: Int) -> ()) {
for (idx, element) in enumerate(self) {
call(element: element, idx: idx)
}
}
}
它基本上是for in enumerate
的捷径。要使用它我会打电话给这样的
[1, 2, 3, 4].each { element, idx in
print(element)
return
}
这会打印1234
,但是我不想要return
。在没有返回的操场上尝试时,它会打印“0个元素”4次,而不是打印该值。
我对扩展的目标是让它像map函数一样工作,它非常简单,很容易将函数应用于数组,但在这种情况下,在不改变原始元素的情况下调用每个元素上的函数。
[1, 2, 3, 4].map { $0 * 2 } //Converts the array to [2, 4, 6, 8]
每个都可以通过调用
来完成[1, 2, 3, 4].each { print($0); return }
这是有效的,但不是使用$0
返回元素,而是返回带有(element, idx)
的元组。我可以通过使用$0.0
作为元素并使用$0.1
作为索引来轻松地使用它,但这感觉太笨重了。我更喜欢只使用$0
作为元素,使用$1
作为缩写语法的索引。我也想防止这种回归变得必要。
总而言之,我想用缩短的$
语法清理我的闭包,让$0
返回第一个参数,$1
第二个元素,我想喜欢在使用类似return
。
println
答案 0 :(得分:1)
Swift 2.0已经内置了这个表达式,但是如果你想自己编写它,就像
一样简单extension CollectionType {
func each(@noescape expression: (Self.Generator.Element, int) -> ()) {
for item in self {
expression(item)
}
}
}
使用索引:
extension CollectionType {
func each(@noescape expression: (Self.Generator.Element, Int) -> ()) {
for (i, item) in self.enumerate() {
expression(item, i)
}
}
}
通过扩展CollectionType
,这适用于Array
和其他集合,例如Set
。