为什么在Swift中不可能使用n-arity currying?

为什么在Swift中不可能使用n-arity currying?,swift,Swift,据了解,在Swift中使用任意数量的参数是不可能的。我想知道为什么。考虑这个代码,在我看来,它应该工作:< /P> func addArray (numbers: [Int]) -> ((Int...) -> Any) { return { (nums: Int...) in (nums.count > 0) ? addArray(numbers+nums) : numbers.reduce(0, combine: +) } } func add

据了解,在Swift中使用任意数量的参数是不可能的。我想知道为什么。考虑这个代码,在我看来,它应该工作:< /P>
func addArray (numbers: [Int]) -> ((Int...) -> Any) {
    return { (nums: Int...) in 
        (nums.count > 0) ? addArray(numbers+nums) : numbers.reduce(0, combine: +)  }
}

func add (numbers: Int...) -> ((Int...) -> Any) {
    return addArray(numbers)
}

  • 问题在于
    Any
    的返回类型(这是
    add
    返回的函数的返回类型)。当您打印
    add(11)(12)
    的值时,您可以看到–由于多态性–这一次它返回了一个函数类型,但就编译器而言,返回值的类型仍然是
    Any
    (在其他某个时间它可能会为这些参数返回另一个类型),无法调用

    如果确定它将返回函数,则可以强制转换它:

    print("sum = \( (add(11)(12) as! ((Int...) -> Any))() )")
    // => sum = 23
    
    请注意,如果尝试使用
    Int
    值,则会遇到相同的类型问题:

    var sum = (add(11)(12) as! ((Int...) -> Any))()
    sum += 1 // Error, because `sum` is `Any`
    
    因此,即使在那里,您也必须:

    var sum = (add(11)(12) as! ((Int...) -> Any))() as! Int
    

    很好的解释,但是哇,这有点可能,但是非常痛苦。
    print("sum = \( (add(11)(12) as! ((Int...) -> Any))() )")
    // => sum = 23
    
    var sum = (add(11)(12) as! ((Int...) -> Any))()
    sum += 1 // Error, because `sum` is `Any`
    
    var sum = (add(11)(12) as! ((Int...) -> Any))() as! Int