Swift使用缩短的美元符号语法支持创建函数闭包

时间:2015-08-30 22:33:04

标签: swift generics closures

我已将此扩展添加到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

1 个答案:

答案 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