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