【发布时间】:2014-09-06 06:44:07
【问题描述】:
作为对 Ruby 的敬意,我一直在玩 Int 的扩展,它允许我编写如下有用的代码:
3.times { println("I keep holding on") }
这很好用,这是扩展:
extension Int {
func times(fn: () -> ()) {
for i in 1...self {
fn()
}
}
}
现在,我想将迭代次数传递给闭包,所以我在扩展中添加了 2nd times() 函数:
extension Int {
func times(fn: (iteration: Int) -> ()) {
for i in 1...self {
fn(iteration: i)
}
}
}
可以这样调用:
5.times { (i: Int) -> () in println("Year \(i)") }
现在,根据 Swift 文档,
总是可以推断出参数类型和返回类型 将闭包作为内联闭包表达式传递给函数时。 因此,您永远不需要完整地编写内联闭包 闭包用作函数参数时的形式。
听起来不错,因为这样我可以省略参数和返回类型,即(i: Int) -> (),而只需使用以下语法:
5.times { i in println("Year \(i)") }
但这会导致以下错误:Error: Ambiguous use of 'times'
这种调用我的times() 函数的方式真的对编译器有歧义吗?
【问题讨论】:
-
请注意,您可以写
5.times { (i: Int) in println("Year \(i)") },这样可以避免歧义并更接近于干净的 Ruby 外观。