为什么在Swift中不可能使用n-arity currying?
据了解,在Swift中使用任意数量的参数是不可能的。我想知道为什么。考虑这个代码,在我看来,它应该工作:< /P>为什么在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
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