How to forward functions with variadic parameters? How to forward functions with variadic parameters? arrays arrays

How to forward functions with variadic parameters?


This has nothing to do with tuples. Anyway, it isn't possible to convert from an array to a tuple in the general case, as the arrays can have any length, and the arity of a tuple must be known at compile time.

However, you can solve your problem by providing overloads:

// This function does the actual workfunc sumOf(_ numbers: [Int]) -> Int {    return numbers.reduce(0, +) // functional style with reduce}// This overload allows the variadic notation and// forwards its args to the function abovefunc sumOf(_ numbers: Int...) -> Int {    return sumOf(numbers)}sumOf(2, 5, 1)func averageOf(_ numbers: Int...) -> Int {    // This calls the first function directly    return sumOf(numbers) / numbers.count}averageOf(2, 5, 1)

Maybe there is a better way (e.g., Scala uses a special type ascription to avoid needing the overload; you could write in Scala sumOf(numbers: _*) from within averageOf without defining two functions), but I haven't found it in the docs.


As of Swift 4.1 (in Xcode 9.2), there is no need to overload with sumOf(_ numbers: Int...), the function that forward variadic parameter(s) will IMPLICITLY change it to a single parameter of array of individual parameter(s). E.g. the following code will work without the overloading:

// This function does the actual workfunc sumOf(_ numbers: [Int]) -> Int {    return numbers.reduce(0, +) // functional style with reduce}func averageOf(_ numbers: Int...) -> Int {    // This calls the first function directly    return sumOf(numbers) / numbers.count}

print(averageOf(2, 5, 1))

Don't know whether this is a bug of the compiler or not :)


I realize this is an older post, but this came up rather high in the search results and I found a working solution.

You can write the sumOf function to accept an array of integers as the number parameter and overload the sumOf function to accept a variadic input for the numbers parameter which will be passed to the first version as an array. This way the averageOf function can pass its variadic input as array to sumOf.

This does not seem very ideal because you need to overload each function that works like this, but it will work in the way you wanted.

func sumOf(numbers: [Int]) -> Int {    var sum = 0    for number in numbers {        sum += number    }    return sum}// Function 1func sumOf(numbers: Int...) -> Int {    return sumOf(numbers: numbers)}// Example UsagesumOf(2, 5, 1)// Function 2func averageOf(numbers: Int...) -> Int {    return sumOf(numbers: numbers) / numbers.count}