代码之家  ›  专栏  ›  技术社区  ›  Robo Robok

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

  •  1
  • Robo Robok  · 技术社区  · 7 年前

    我们可以像这样在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:))
    

    我知道这个例子有点扭曲,但我希望重点是明确的。我试图在传递函数的过程中为其中一个参数提供一个静态值。

    用斯威夫特能做到吗?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Sweeper    7 年前

    不幸的是,Swift功能没有那么灵活:(

    你正在尝试做的与 咖喱 ,这曾是Swift的一项功能,但后来被删除。

    您可以尝试修改 curry 函数在本例中显示 question 以咖喱函数的第二个参数,但这不是那么有用,因为它不是一个通用的解决方案。你必须写一份单独的报告 咖喱 对于1个参数功能、2个参数功能、3个参数功能等 那些 ,您还需要一个单独的 咖喱 要转换第一个参数,第二个参数,第三个参数。。。情况实在太多了。

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