代码之家  ›  专栏  ›  技术社区  ›  Santa Claus

隐式强制转换函数接收元组

  •  3
  • Santa Claus  · 技术社区  · 6 年前

    我刚发现有一个暗含的演员:
    来自取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
    

    这种行为是否有记录?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Cristik    6 年前

    在Swift3之前,可以通过显式地指定参数或传递精心设计的元组来调用函数。但是,当 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的建议。我们承认,我们正在删除一个有用的特性,而没有提供同样有表现力的替换。然而, 在类型检查器中维护此行为 是实现复杂性的严重来源,并积极干扰我们巩固类型系统的计划。

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