簡體   English   中英

Swift 帶參數語法的閉包

[英]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() 方法,以便它可以喝啤酒或杜松子酒嗎?

現在, beergin是不同類型的閉包( 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.

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