首页 > 解决方案 > 隐式转换函数接收元组

问题描述

我刚刚发现有一个隐式转换:
从采用 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

这种行为是否记录在某处?

标签: swifttuples

解决方案


在 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 接受。我们承认我们正在删除一个有用的功能,但没有提供同样富有表现力的替代品。但是,在类型检查器中维护这种行为是实现复杂性的严重来源,并且会积极干扰我们巩固类型系统的计划。

所以看起来只在类型检查器级别禁止了逐个调用函数的支持,这意味着您不能直接将元组传递给函数,但是编译器的内部保持不变,这允许元组的间接传递,例如问题中的例子。


推荐阅读