我已将此扩展添加到数组
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
,但我希望它不需要返回
。当在没有返回的 Playground 中尝试时,它会打印“0 elements”4次,而不是打印值。
我的扩展目标是使其像映射函数一样工作,这非常短且易于将函数应用于数组,但在这种情况下,在每个元素上调用函数而不改变原始元素。
[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
来使用缩短的 $
语法来清理我的闭包> 第二个元素,我希望在使用 println
之类的函数调用函数时不需要 return
。
最佳答案
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
。
关于Swift 创建函数闭包,支持缩短的美元符号语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32301802/