我们可以像下面这样在Swift中传递函数:
func celebrate(callback: (String, String) -> String) -> String {
return callback("", "") + ""
}
func glam(item1: String, item2: String) -> String {
return item1 + "" + item2
}
celebrate(callback: glam) // glam function being passed
最近我了解到它也可以通过这种方式传递:
celebrate(callback: glam(item1:item2:)) // great for function overloading
我认为,如果此语法允许在传递函数时绑定值,那将非常棒,例如JavaScript允许.bind()
使用。它可以允许传递要求调用者使用更多参数的函数:
func fun(item1: String, item2: String, item3: String) -> String {
return item1 + "" + item2 + "" + item3
}
celebrate(callback: fun) // obviously won't work, because the arguments number doesn't match
// this is the goal, but with invalid syntax:
celebrate(callback: fun(item1:item2="":item3:))
我知道这个例子有点扭曲,但是我希望重点是明确的。我试图在传递函数的过程中为其中一个参数赋予静态值。
可以用Swift完成吗?
答案 0 :(得分:1)
不幸的是,迅速功能并不那么灵活:(
您要尝试做的事与 currying 非常相似,后者曾经是Swift的功能,但后来被删除了。
您可以尝试修改此question中显示的curry
函数以使用函数的第二个参数,但这并没有太大用处,因为它不是一般的解决方案。您将必须为1个参数函数,2个参数函数,3个参数函数等编写单独的curry
。对于每个 来说,您还需要单独的curry
来进行咖喱第一个参数,第二个参数,第三个参数...情况太多了。
我只会使用闭包:
celebrate(callback: {fun(item1: $0, item2: "", item3: $1)})