En Swift, una función es un conjunto de declaraciones agrupadas para realizar una tarea específica. Se declara usando la palabra clave “func”. También podemos establecer el tipo de retorno de la función especificando el tipo de datos seguido de una flecha de retorno («->»).
Sintaxis:
func functionName(parámetros) -> returnType {
// cuerpo
}
Ejemplo:
En el siguiente programa, estamos imprimiendo una string al definir una función que no contiene ningún parámetro ni tipo de retorno.
Swift
// Swift program to illustrate how we // can print a string using a function // Function to print a string // This function have no return type func print() { print("GeeksforGeeks") } // Calling print function print()
Producción:
GeeksforGeeks
Sobrecarga de funciones
La sobrecarga de funciones es la característica más utilizada por los desarrolladores. Esta técnica les permite crear funciones que comparten algunas características comunes como el mismo nombre, etc. En Swift, un par de funciones pueden tener el mismo nombre siempre que sean diferentes en el número de parámetros, el tipo de al menos uno correspondiente parámetro, o la etiqueta de al menos un parámetro correspondiente. Estas funciones se conocen como funciones sobrecargadas y esta característica se conoce como sobrecarga de funciones. Aporta más flexibilidad y es útil cuando requerimos el mismo o similar resultado o funcionalidad.
Hay tres métodos mediante los cuales podemos lograr la sobrecarga de funciones en Swift y se analizan a continuación:
Sobrecarga de funciones con diferente número de parámetros
Las funciones que tienen el mismo tipo de datos de los parámetros correspondientes pero son diferentes en la cantidad de parámetros que contienen pueden tener el mismo nombre de las funciones. En el siguiente programa, tenemos tres funciones del mismo nombre que es printSum pero con un número diferente de parámetros. Aquí, la primera función contiene dos parámetros de tipo entero, la segunda función contiene tres parámetros de tipo entero mientras que la tercera función contiene cuatro parámetros de tipo entero.
Ejemplo:
Swift
// Swift program to illustrate function overloading // Function 1 to calculate sum func printSum(value1: Int, value2: Int) { // Calculating sum of value1 and value2 let sum = value1 + value2 // Print the sum print("The sum of", value1, "and", value2, "is equal to", sum) } // Function 2 to calculate sum func printSum(value1: Int, value2: Int, value3: Int) { // Calculating sum of value1 and value2 let sum = value1 + value2 + value3 // Print the sum print("The sum of", value1, ",", value2, "and", value3, "is equal to", sum) } // Function 3 to calculate sum func printSum(value1: Int, value2: Int, value3: Int, value4: Int) { // Calculating sum of value1 and value2 let sum = value1 + value2 + value3 + value4 // Print the sum print("The sum of", value1, ",", value2, ",", value3, "and", value4, "is equal to", sum) } // Calling printSum() function to calculate sum printSum(value1: 5, value2: 15) // Calling printSum() function to calculate sum printSum(value1: 5, value2: 15, value3: 25) // Calling printSum() function to calculate sum printSum(value1: 5, value2: 15, value3: 25, value4: 35)
Producción:
The sum of 5 and 15 is equal to 20 The sum of 5 , 15 and 25 is equal to 45 The sum of 5 , 15 , 25 and 35 is equal to 80
Sobrecarga de funciones con el mismo número de parámetros
Las funciones que tienen el mismo número de parámetros pero al menos uno de los parámetros correspondientes son diferentes en los tipos de datos pueden tener el mismo nombre de las funciones. En el siguiente programa, tenemos tres funciones del mismo nombre que es printSum, aunque todas las funciones contienen la misma cantidad de parámetros pero tienen diferentes tipos. La primera función contiene dos parámetros de tipo entero, la segunda función contiene un parámetro de tipo entero y uno flotante, y la tercera función contiene dos parámetros de tipo flotante.
Ejemplo:
Swift
// Swift program to illustrate function overloading // Function 1 to calculate sum func printSum(value1: Int, value2: Int) { // Calculating sum of value1 and value2 let sum = value1 + value2 // Print the sum print("The sum of", value1, "and", value2, "is equal to", sum) } // Function 2 to calculate sum func printSum(value1: Int, value2: Float) { // Calculating sum of value1 and value2 let sum = Float(value1) + value2 // Print the sum print("The sum of", value1, "and", value2, "is equal to", sum) } // Function 3 to calculate sum func printSum(value1: Float, value2: Float) { // Calculating sum of value1 and value2 let sum = value1 + value2 // Print the sum print("The sum of", value1, "and", value2, "is equal to", sum) } // Calling printSum() function to calculate sum printSum(value1: 5, value2: 15) // Calling printSum() function to calculate sum printSum(value1: 5, value2: 15.123) // Calling printSum() function to calculate sum printSum(value1: 5.123, value2: 15.123)
Producción:
The sum of 5 and 15 is equal to 20 The sum of 5 and 15.123 is equal to 20.123001 The sum of 5.123 and 15.123 is equal to 20.246
Sobrecarga de funciones con diferentes etiquetas de argumentos
Dos funciones que tienen el mismo tipo de datos de parámetros correspondientes y también tienen el mismo número de parámetros pero tienen diferentes nombres de etiquetas pueden tener el mismo nombre de funciones. En el siguiente programa, tenemos tres funciones del mismo nombre que es printSum, aunque todas las funciones contienen el mismo número y tipo de parámetros pero tienen diferentes etiquetas. La primera función contiene dos parámetros de tipo entero con etiquetas value1 y value2, la segunda función contiene dos parámetros de tipo entero con etiquetas variable1 y variable2, y la tercera función contiene dos parámetros de tipo entero con etiquetas number1 y number2.
Ejemplo:
Swift
// Swift program to illustrate function overloading // Function 1 to calculate sum func printSum(value1: Int, value2: Int) { // Calculating sum of value1 and value2 let sum = value1 + value2 // Print the sum print("The sum of", value1, "and", value2, "is equal to", sum) } // Function 2 to calculate sum func printSum(variable1: Int, variable2:Int) { // Calculating sum of value1 and value2 let sum = variable1 + variable2 // Print the sum print("The sum of", variable1, "and", variable2, "is equal to", sum) } // Function 3 to calculate sum func printSum(number1: Int, number2: Int) { // Calculating sum of value1 and value2 let sum = number1 + number2 // Print the sum print("The sum of", number1, "and", number2, "is equal to", sum) } // Driver code // Calling printSum() function to calculate sum printSum(value1: 15, value2: 15) // Calling printSum() function to calculate sum printSum(value1: 30, value2: 30) // Calling printSum() function to calculate sum printSum(value1: 60, value2: 60)
Producción:
The sum of 15 and 15 is equal to 30 The sum of 30 and 30 is equal to 60 The sum of 60 and 60 is equal to 120
Sobrecarga de funciones según el tipo de retorno
¿Podemos sobrecargar las funciones sobre la base del tipo de retorno de la función solamente? La respuesta es No. No podemos sobrecargar las funciones usando diferentes tipos de devolución para las funciones. En otras palabras, si hay al menos dos funciones en un programa que tienen el mismo tipo de datos de parámetros correspondientes y tienen exactamente la misma cantidad de parámetros, entonces el compilador produce un error de tiempo de compilación. En el siguiente programa, la primera función tiene un tipo de retorno entero y contiene dos parámetros de tipo entero, la segunda función tiene un tipo de retorno doble y contiene dos parámetros de tipo entero. Además, los parámetros correspondientes tienen la misma etiqueta. Por lo tanto, esto no está permitido en Swift.
Ejemplo:
Swift
// Swift program to illustrate function overloading // Function 1 to calculate sum func printSum(value1: Int, value2: Int) -> Int { // Calculating sum of value1 and value2 let sum = value1 + value2 // Print the sum return(sum) } // Function 2 to calculate sum func printSum(value1: Int, value2:Int) -> Double { // Calculating sum of value1 and value2 let sum = value1 + value1 // Print the sum return (Double)(sum) } // Driver code // Calling printSum() function to calculate sum print("The sum of 15 and 25 is equal to", printSum(value1: 15, value2: 25)) // Calling printSum() function to calculate sum print("The sum of 25 and 35 is equal to", printSum(value1: 25, value2: 35))
Producción:
main.swift:28:7: error: ambiguous use of 'printSum(value1:value2:)' printSum(value1: 15, value2: 25)) ^ main.swift:4:6: note: found this candidate func printSum(value1: Int, value2: Int) -> Int ^ main.swift:15:6: note: found this candidate func printSum(value1: Int, value2:Int) -> Double ^ main.swift:32:7: error: ambiguous use of 'printSum(value1:value2:)' printSum(value1: 25, value2: 35)) ^ main.swift:4:6: note: found this candidate func printSum(value1: Int, value2: Int) -> Int ^ main.swift:15:6: note: found this candidate func printSum(value1: Int, value2:Int) -> Double ^