首页 > 解决方案 > 在 Swift 中传递函数时可以绑定参数值吗?

问题描述

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

标签: iosswiftxcode

解决方案


不幸的是,Swift 函数没有那么灵活:(

您正在尝试做的与currying非常相似,它曾经是 Swift 的一个特性,但后来被删除了。

您可以尝试修改此问题curry中的函数 show 以对函数的第二个参数进行柯里化,但这不是很有用,因为它不是通用解决方案。您必须为 1 个参数函数、2 个参数函数、3 个参数函数等编写一个单独的函数。对于其中的每一个您还需要一个单独的 curry 的第一个参数、第二个参数、第三个参数......案例太多。currycurry

我只会使用一个闭包:

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

推荐阅读