Pasar una matriz a una función con número variable de argumentos en Swift

En The Swift Programming Language , dice:

Las funciones también pueden tomar una cantidad variable de argumentos y recostackrlos en una matriz.

func sumOf(numbers: Int...) -> Int { ... } 

Cuando llamo a tal función con una lista de números separados por comas (`sumOf (1, 2, 3, 4), están disponibles como una matriz dentro de la función.

Pregunta: ¿y si ya tengo una matriz de números que quiero pasar a esta función?

 let numbers = [1, 2, 3, 4] sumOf(numbers) 

Esto falla con un error del comstackdor, “No se pudo encontrar una sobrecarga para ‘__conversion’ que acepta los argumentos proporcionados”. ¿Hay alguna manera de convertir una matriz existente en una lista de elementos que puedo pasar a una función variadica?

Splatting todavía no está en el lenguaje , como confirmaron los desarrolladores. La solución por ahora es usar una sobrecarga o esperar si no puede agregar sobrecargas.

Aquí hay un trabajo que encontré. Sé que no es exactamente lo que quieres, pero parece estar funcionando.

Paso 1: declare la función que desea con una matriz en lugar de argumentos variados:

 func sumOf(numbers: [Int]) -> Int { var total = 0 for i in numbers { total += i } return total } 

Paso 2: llama esto desde dentro de tu función variadic:

 func sumOf(numbers: Int...) -> Int { return sumOf(numbers) } 

Paso 3: Llamar de cualquier manera:

 var variadicSum = sumOf(1, 2, 3, 4, 5) var arraySum = sumOf([1, 2, 3, 4, 5]) 

Parece extraño, pero está funcionando en mis pruebas. Avíseme si esto causa problemas imprevistos para cualquier persona. Swift parece ser capaz de separar la diferencia entre las dos llamadas con el mismo nombre de función.

Además, con este método, si Apple actualiza el idioma como sugiere la respuesta de @ manojid, solo necesitará actualizar estas funciones. De lo contrario, tendrás que realizar un gran cambio de nombre.

Puede emitir la función:

 typealias Function = [Int] -> Int let sumOfArray = unsafeBitCast(sumOf, Function.self) sumOfArray([1, 2, 3]) 

Puede usar una función auxiliar como tal:

 func sumOf (numbers : [Int]) -> Int { return numbers.reduce(0, combine: +) } func sumOf (numbers : Int...) -> Int { return sumArray (numbers) } 

Hice esto (Wrapper + Identity Mapping):

 func addBarButtonItems(types: REWEBarButtonItemType...) { addBarButtonItems(types: types.map { $0 }) } func addBarButtonItems(types: [REWEBarButtonItemType]) { // actual implementation } 

Sé que esta respuesta no responde a su pregunta exacta, pero creo que vale la pena señalarla. Yo también estaba empezando a jugar con Swift e inmediatamente me encontré con una pregunta similar. La respuesta de Manojlds es mejor para su pregunta, estoy de acuerdo, pero nuevamente, se me ocurrió otra solución. También me gusta que Logan esté mejor.

En mi caso, solo quería pasar una matriz:

 func sumOf(numbers: Array) -> Int { var sum = 0 for number in numbers { sum += number } return sum } var someNums = [8,7,2,9,12] sumOf(someNums) sumOf([10, 15, 20]) 

Solo quería compartir, en caso de que alguien más estuviera pensando como yo. La mayoría de las veces preferiría pasar la matriz así, pero aún no creo que sea “Rápido”. 🙂