[英]Swift closure with parameter syntax
我正在學習 swift,我被困在帶有參數語法的瘋狂閉包中。 以下是執行此操作的“正確方法”。
enum Brew: Int {
case lager
case barleyWine
case porter
}
let beer = { (kind: Brew) -> Void in
print( "\(kind), smooth!")
}
let gin = { () -> Void in
print("gin & juice")
}
func sip( on drink: () -> Void ) {
print("Sip...")
drink()
}
func sip( on drink: (Brew) -> Void ) {
print("Sip...")
drink(brew.porter)
}
sip( on: beer )
sip( on: gin )
這打印...
Sip...
porter, smooth!
Sip...
gin & juice
但是,這對我來說沒有多大意義。 每當我用啤酒調用 sip() 時,它的編碼方式就假定它是搬運工。 似乎我應該能夠在對 sip 的調用中指定 brew 而不是在 sip 定義中。 像這樣的東西......
sip( on: beer( brew.porter )
這樣啤酒閉包在被調用時被參數化。 這不是更具可讀性和實用性嗎? 為什么不是這樣呢? 是否有實現此目的的語法?
另外,難道不應該有一種方法可以編寫一個帶有可變參數的 sip() 方法,以便它可以喝啤酒或杜松子酒嗎? 如何?
關閉令人困惑!
另外,難道不應該有一種方法可以編寫一個帶有可變參數的 sip() 方法,以便它可以喝啤酒或杜松子酒嗎?
現在, beer
和gin
是不同類型的閉包( beer
有一個參數而gin
沒有),這就是為什么你需要兩個sip
重載 - 一個來處理每種類型。 想象一下,如果有一個可以同時接受它們的sip
會發生什么。 它怎么知道是否傳遞參數?
另一方面,如果你的最終目標是這樣的:
sip(on: beer(brew.porter))
然后聲明一個sip
是可能的。
現在,執行beer(brew.porter)
將調用beer
關閉。 beer
閉包返回Void
,而Void
不能傳遞到sip
中,所以這是行不通的。 您的直覺可能會說“為什么beer(brew.porter)
不能返回另一個閉包,即當不帶參數調用時,用波特啤酒喝啤酒?” 恭喜,你發現了柯里化。
你可以改變beer
來做到這一點:
let beer = { (kind: Brew) -> (() -> Void) in // a closure that returns a closure!
// return { () -> Void in print("\(kind), smooth!") }
return { print( "\(kind), smooth!") } // short-hand
}
現在你只需要這sip
:
func sip( on drink: () -> Void ) {
print("Sip...")
drink()
}
但在現實世界中,您通常無法更改beer
(因為它是別人的代碼,或者沒有意義)。 在這種情況下,您必須更改調用sip
的方式:
// "{}" indicates a closure! You are putting the closure call "beer(brew.porter)" inside another closure.
sip(on: { beer(brew.porter) })
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.