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

标签 swift generics closures

我已将此扩展添加到数组

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/

相关文章:

java - 使用多个接口(interface)的最佳方式是什么?

c# - 从 Func<object,string> 到 Func<string,string> 的转换有效,但到 Func<int,string> 失败

javascript - 如何在没有闭包的情况下对共享状态进行编程?

rust - 为什么闭包会引入借用,而内联的相同代码却不会引入借用?

ios - 无法在 Swift 中生成多页 PDF

ios - 在 Xcode 中比通常的编译时间更长

swift - 访问 RealmSwift 中的原始类型

scala - Map Scala中的不同类型

for-loop - for-range 构造与 Go 中的闭包有何关系?

ios - UIView水平动画不水平