你好我有一个创建了一个函数,它接受最后一个参数作为闭包。
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
}
但我不知道为什么它可以在没有任何返回声明的情况下致电。请告诉我它是如何发生的?
答案 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
。在大多数情况下,最好让代码以后更容易阅读。你未来的自我(和你之后使用代码的其他人)会感谢你。