En The Swift Programming Language , dice:
Las funciones también pueden tomar un número variable de argumentos, reuniéndolos 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: ¿qué pasa si ya tengo una serie de números que quiero pasar a esta función?
let numbers = [1, 2, 3, 4]
sumOf(numbers)
Esto falla con un error del compilador, "No se pudo encontrar una sobrecarga para '__conversión' que acepte los argumentos proporcionados". ¿Hay alguna manera de convertir una matriz existente en una lista de elementos que puedo pasar a una función variadic?
swift
variadic-functions
Ole Begemann
fuente
fuente
Respuestas:
Las salpicaduras aún no están en el idioma , como lo confirman los desarrolladores. La solución por ahora es usar una sobrecarga o esperar si no puede agregar sobrecargas.
fuente
sumOf(...numbers)
print
!Aquí hay una solución 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 variables:
Paso 2: llame a esto desde su función variadic:
Paso 3: llame de cualquier manera:
Parece extraño, pero está funcionando en mis pruebas. Avíseme si esto causa problemas imprevistos para alguien. 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á que pasar y renombrar mucho.
fuente
Puedes lanzar la función:
fuente
func sumOf(foo numbers: Int..., bar: Bool) -> Int {};
requieretypealias Function = (foo: [Int], bar: Bool) -> Int;
unsafeBitCast
. Esto puede funcionar hoy, pero a menos que una referencia lo indique, la próxima versión del compilador es libre de hacer literalmente cualquier cosa aquí (error del compilador / bloqueo / código de ejecución aleatoria ...). Echa un vistazo a la advertencia de aspecto serio en unsafeBitCast .Puede usar una función auxiliar como tal:
fuente
Int...
y no se puede (fácilmente) cambiar.apply
procedimiento. Supongo que algunas personas llaman a eso 'salpicaduras'.sumArray
referencia aquí?Sé que esta respuesta no responde a su pregunta exacta, pero creo que vale la pena señalar. Yo también estaba empezando a jugar con Swift e inmediatamente me encontré con una pregunta similar. La respuesta de Manojld es mejor para su pregunta, estoy de acuerdo, pero nuevamente, otra solución que se me ocurrió. A mí también me gusta más Logan.
En mi caso, solo quería pasar una matriz:
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 de esta manera, pero todavía no creo que sea "Swiftly". :)
fuente
Hice esto (Wrapper + Identity Mapping):
fuente
Swift 5
Este es un enfoque con
@dynamicCallable
función que permite evitar la sobrecarga ounsafeBitCast
debe realizar unastruct
llamada específica :fuente