swift - 隐式转换函数接收元组
问题描述
我刚刚发现有一个隐式转换:
从采用 n 个参数(A, B, ...) -> R
的函数到采用 n 元组的函数((A, B, ...)) -> R
示例 n°1
func withTuple(_ a: (Int, Int)) { }
func withoutTuple(_ a: Int, _ b: Int) { }
func call(tupleFunction: ((Int, Int)) -> ()) {
tupleFunction((1, 2))
}
call(tupleFunction: withTuple)
call(tupleFunction: withoutTuple) // Magic here
(有效的 Swift 4.2 代码)
示例 n°2
[(1, 2), (3, 3)].map(*) // Magic here
这种行为是否记录在某处?
解决方案
在 Swift 3 之前,可以通过显式指定参数或传递精心设计的元组来调用函数。然而,当SE-0029实施时,这种调用函数的方式被删除了。
基本上,以下是可能的:
func buildDescription(name: String, age: Int) -> String {
return "Hi, I am \(name), and I am \(age)"
}
buildDescription("John Doe", age: 21)
// or, via a tuple, giving the same result
buildDescription(("John Doe", name: 21))
Swift 论坛有这篇关于上述变化的帖子(强调我的):
该提案已被 Swift 3 接受。我们承认我们正在删除一个有用的功能,但没有提供同样富有表现力的替代品。但是,在类型检查器中维护这种行为是实现复杂性的严重来源,并且会积极干扰我们巩固类型系统的计划。
所以看起来只在类型检查器级别禁止了逐个调用函数的支持,这意味着您不能直接将元组传递给函数,但是编译器的内部保持不变,这允许元组的间接传递,例如问题中的例子。
推荐阅读
- node.js - 如果数据库中不存在数组字段值,如何推送数组字段值?
- angular - component.ts 文件中的错误限制了角度渲染
- angular - Angular 无法分配给“名称”,因为它是常量或只读属性
- css - 悬停时子 div 大于父 div
- spring - 在触发石英作业时出现异常
- r - 如何按顺序测量比例?
- html - 使用 python 将文本翻译成 html 文本
- sql - SQL 错误 ORA-00979 'not a group by expression' 但我无法弄清楚我的 group-by 语句有什么问题
- php - 如何将循环中的长无序列表分成两个相邻的容器
- faunadb - 如何获取我创建的最后一个实例的 ref(id)