簡體   English   中英

快速關閉尾隨問題?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM