【发布时间】:2021-02-07 01:00:09
【问题描述】:
我正在快速学习,但我被参数语法的疯狂闭包困住了。以下是执行此操作的“正确方法”。
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 的调用中而不是在 sip 定义中指定 brew 。像这样的...
sip( on: beer( brew.porter )
这样啤酒闭包在被调用时就被参数化了。这不是更具可读性和实用性吗?为什么不是这样?有没有一种语法可以做到这一点?
另外,不应该有一种方法可以编写一个带有可变参数的 sip() 方法,以便它可以接收啤酒或杜松子酒吗?怎么样?
闭包令人困惑!
【问题讨论】:
-
你想让
sip做什么?你希望关闭做什么?现在你正在传递一个带有参数的闭包,sip通过传递一个.porter来调用它。你提供的你想要的例子对我来说没有意义。看起来您想将闭包和参数都传递给它;目前尚不清楚为什么。