快速跟踪关闭问题?

时间:2017-06-12 01:16:51

标签: ios swift xcode closures

你好我有一个创建了一个函数,它接受最后一个参数作为闭包。

    name,ID,carPass,cardLost
    James,1,yes,no
    Daniel,2,no,no
    Georgia,3,yes,yes
    Norman,4,no,no
    Tom,5,no,no
    Sam,6,yes,no

现在,当我调用此函数时。调用此函数的一种方法就像这样。

func sum(from: Int, to: Int, f: (Int) -> (Int)) -> Int {
    var sum = 0
    for i in from...to {
        sum += f(i)
    }
    return sum
}

我已经看到swift中的一个概念作为尾随闭包。使用尾随闭包我可以像这样调用函数。

sum(from: 1, to: 10) { (num) -> (Int) in
return 10
}

但我不知道为什么它可以在没有任何返回声明的情况下致电。请告诉我它是如何发生的?

2 个答案:

答案 0 :(得分:3)

这里没有答案,除了"因为语言允许它。"如果闭包中有单个表达式,则可以省略Book

涵盖此内容的部分是来自The Swift Programming Language的"Implicit Returns from Single-Expression Closures"

  

单表达式闭包可以通过从声明中省略return关键字来隐式返回单个表达式的结果,如上一个示例的此版本所示:

return
     

这里,sorted(by :)方法的参数的函数类型清楚地表明闭包必须返回一个Bool值。因为闭包的主体包含一个返回Bool值的表达式(s1> s2),所以没有歧义,并且可以省略return关键字。

然而,这与尾随闭包语法无关。如果它们是单表达式,那么所有闭包都有隐式返回。

答案 1 :(得分:1)

正如@ rob-napier所说,你可以这样做只是因为语言允许它。

但是,请注意,您的示例在最后一部分中也做了两件不同的事情:

sum(from: 1, to: 10) {
    $0
}

您不仅省略return语句,而且还省略了命名参数,因此$0不依赖于省略return功能。

这只是省略return

的更准确的示例
sum(from: 1, to: 10) { (num) -> (Int) in
    num
}

那就是说,我不建议使用其中任何一个features。在大多数情况下,最好让代码以后更容易阅读。你未来的自我(和你之后使用代码的其他人)会感谢你。