ios - 在 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 完成吗?
解决方案
不幸的是,Swift 函数没有那么灵活:(
您正在尝试做的与currying非常相似,它曾经是 Swift 的一个特性,但后来被删除了。
您可以尝试修改此问题curry
中的函数 show 以对函数的第二个参数进行柯里化,但这不是很有用,因为它不是通用解决方案。您必须为 1 个参数函数、2 个参数函数、3 个参数函数等编写一个单独的函数。对于其中的每一个,您还需要一个单独的 curry 的第一个参数、第二个参数、第三个参数......案例太多。curry
curry
我只会使用一个闭包:
celebrate(callback: {fun(item1: $0, item2: "", item3: $1)})
推荐阅读
- c++ - 为什么将“&& true”添加到约束中会使函数模板成为更好的重载?
- left-join - 加入另一个表时红移空列
- azure-iot-edge - 无法连接到本地存储帐户
- angular - 带有 Angular 的 CKEditor5:注册模型和转换不起作用
- ssh - WSL2 SSH RemoteForward 连接回来
- python - 如何在 tasks.loop discord.py bot 中运行命令
- docker - How can I connect to Kafka local from KSQL docker container?
- java - parsing error while inserting date in ClickHouse using JDBC prepared statement
- javascript - 成功执行测试后写入报告文件时出错
- flurl - 使用 Flurl,了解生命周期管理的重要概念是什么?