[英]Trailing closure issue in swift?
您好,我創建了一個函數,該函數接受最后一個參數作為閉包。
func sum(from: Int, to: Int, f: (Int) -> (Int)) -> Int {
var sum = 0
for i in from...to {
sum += f(i)
}
return sum
}
現在我當我調用此函數時。如下所示是調用此函數的一種方法。
sum(from: 1, to: 10) { (num) -> (Int) in
return 10
}
我已經將swift的概念之一視為尾隨閉包。有了尾隨閉包,我可以像這樣調用函數。
sum(from: 1, to: 10) {
$0
}
但是我不知道為什么它可以在沒有任何return語句的情況下調用。請告訴我它是如何發生的?
除了“因為語言允許”以外,這里真的沒有答案。 如果閉包中只有一個表達式,則可以省略return
。
涵蓋這一部分的內容是來自Swift編程語言的“單表達式閉包的隱式返回” 。
單表達式閉包可以通過從聲明中省略return關鍵字來隱式返回其單表達式的結果,如上一個示例的此版本所示:
reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )
在這里,sorted(by :)方法的參數的函數類型清楚地表明,閉包必須返回Bool值。 因為閉包的主體包含返回Bool值的單個表達式(s1> s2),所以沒有歧義,可以省略return關鍵字。
但是,這與尾隨閉包語法無關。 如果所有閉包都是單表達式,則它們都具有隱式返回。
正如@ rob-napier所說,您可以這樣做只是因為語言允許它。
但是,請注意,您的示例在最后一部分中還將做兩件事:
sum(from: 1, to: 10) {
$0
}
您不僅要省略return
語句,而且還要省略命名參數,因此$0
並不取決於省略return
功能。
這只是省略return
的更准確的示例:
sum(from: 1, to: 10) { (num) -> (Int) in
num
}
就是說,我不建議您使用其中任何一個features
。 在大多數情況下,最好使代碼稍后易於閱讀。 您未來的自我(以及在您之后使用該代碼的其他人)將感謝您。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.