Swift 创建具有简化美元符号语法支持的函数闭包

Swift create function closure with shortened dollar sign syntax support

我已将此扩展添加到 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。在没有 return 的操场上尝试时,它会打印 4 次“0 元素”而不是打印值。

我的扩展目标是让它像 map 函数一样工作,它非常简短且易于将函数应用于数组,但在这种情况下,在不改变原始元素的情况下对每个元素调用一个函数。

[1, 2, 3, 4].map { [=13=] * 2 } //Converts the array to [2, 4, 6, 8]

每一个都可以通过调用

来完成
[1, 2, 3, 4].each { print([=14=]); return }

这行得通,但是 return 元素与 [=18=] 不同,它 return 是一个带有 (element, idx) 的元组。通过对元素使用 [=20=].0 对索引使用 [=21=].1 ,我可以很容易地使用它,但这感觉太笨重了。我更愿意只对元素使用 [=18=],对具有缩短语法的索引使用 </code>。我还想避免 return 成为必要。</p> <p>所以总而言之,我想通过将 <code>[=18=] 作为第一个参数 returned 并将 </code> 作为第一个参数来使用缩短的 <code>$ 语法清理我的闭包第二个元素,我想在使用 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.