繁体   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