在Swift中传递函数时可以绑定参数值吗?

时间:2019-01-10 07:27:09

标签: ios swift xcode

我们可以像下面这样在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完成吗?

1 个答案:

答案 0 :(得分:1)

不幸的是,迅速功能并不那么灵活:(

您要尝试做的事与 currying 非常相似,后者曾经是Swift的功能,但后来被删除了。

您可以尝试修改此question中显示的curry函数以使用函数的第二个参数,但这并没有太大用处,因为它不是一般的解决方案。您将必须为1个参数函数,2个参数函数,3个参数函数等编写单独的curry。对于每个 来说,您还需要单独的curry来进行咖喱第一个参数,第二个参数,第三个参数...情况太多了。

我只会使用闭包:

celebrate(callback: {fun(item1: $0, item2: "", item3: $1)})