【问题标题】:Implicit cast function receiving tuple隐式转换函数接收元组
【发布时间】:2019-01-21 03:09:51
【问题描述】:

我刚刚发现有一个隐式转换:
来自带 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 tuples


    【解决方案1】:

    在 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 forums 有关于上述更改的帖子(强调我的):

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

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

    【讨论】:

      猜你喜欢
      • 2016-06-21
      • 2018-09-25
      • 1970-01-01
      • 2018-11-01
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 2017-06-05
      • 1970-01-01
      相关资源
      最近更新 更多