2016-09-22 30 views
3

我很好奇這些語法陳述中哪一個是(更正確的)。 遊樂場愉快地編譯這兩種情況。swift中不同類型的閉包語法 - 哪一個是正確的?

方法1

// copied from SO and this appears clear to me 
UIView.animate(
    withDuration: 3.0, 
    animations: { 

    }, 
    completion: { (Bool) in 
     // completion code 
    } 
) 

方法2

UIView.animate(
    withDuration: 3.0, 
    animations: { 

     // code 

    }) {(Bool) in 
     // code when finished? 
     // argument label completion missing? 
    } 

爲什麼圓的括號內第二方法最後一個參數之前關閉陳述?或者是另一種執行UIView.animation

回答

4

這兩種方法之間的差異被以下:

方法1:普通閉合

方法2:尾隨閉合Last函數簽名中的閉包參數可以寫成較短的語法。如果第二個參數是completion,並且animations參數將是最後一個,則尾隨閉包將應用於動畫等。 因此它必須作爲最後(或唯一)閉包參數。

如果你錯過了completion標籤,你可以自由地喜歡這類型的:

UIView.animate(withDuration: 3.0, animations: { 

}) {(completion: Bool) in 

} 

對於你的問題結束還有:這是一個功能相同的相同的實現,但不同的語法

+1

正想這麼說,但你說好聽。使用尾隨閉包的好處是它通常會產生更清晰的代碼。 – picciano

+0

好了之後,我再次看了一遍,它看起來對我來說更乾淨:)謝謝。 – GiorgioE

6

兩者都是正確的。

  1. 這是函數調用中通常的閉包語法。

  2. 它代表一個拖尾關閉

如果你需要一個封閉表達式傳遞給函數作爲 函數的最後一個參數和封蓋表現爲長,它可以 是它寫成一個尾部,而不是封有用。尾隨 閉包在函數調用的括號後面寫入,儘管它仍然是該函數的參數。當您使用尾隨的 閉包語法時,您不會將閉包的參數標籤寫爲 函數調用的一部分。

你可以閱讀更多關於關閉尾隨從https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

+1

謝謝,所以我們不應該寫arg。尾隨封閉內的標籤?或者只是不需要? – GiorgioE

+2

沒有用於使用尾隨閉包來寫參數標籤的範圍。 「完成:」不需要寫。尾隨閉包的主體寫在方法調用括號之外,即UIView.animate(...){尾隨閉包體} – PGDev

相關問題