English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Parámetros y valores de retorno de las funciones en Swift

En este artículo, aprenderá diferentes funciones definidas por el usuario, que obtendrán diferentes tipos de entrada y devolverán salida a través de ejemplos.

En el artículo anteriorFunciones en SwiftHemos aprendido sobre funciones. Ahora, exploraremos diferentes formas y tipos de creación de funciones en Swift, es decir, manejar entrada y salida en funciones.

Funciones sin parámetros ni valor de retorno

Estos tipos de funciones no aceptan ningún parámetro de entrada ni valor de retorno.

func funcname() {
    //Instrucciones
}
O
func funcname() -> () {
    //Instrucciones
}
O
func funcname() -> Void {
    //Instrucciones
}

Todas las sintaxis anteriores son válidas para crear funciones sin parámetros ni valor de retorno.

La sintaxis func funcname()->() también es equivalente a func funcname()->void, ya que void es un alias de tipo para () . Puede acceder aAlias de tipo SwiftPara obtener más información.

Ejemplo1Sin parámetros ni valor de retorno

func greetUser() {
    print("Good Morning!")
}
greetUser()

Cuando ejecute el programa anterior, la salida será:

Good Morning!

Funciones sin parámetros pero con valor de retorno

Estos tipos de funciones no aceptan ningún parámetro de entrada, sino que devuelven un valor. Para agregar un tipo de retorno, necesita agregar una flecha (-Y el tipo de retorno.

func funcname() -> ReturnType {
    //Instrucciones
    return value
}

Ejemplo2Sin parámetros pero con valor de retorno

func greetUser() -> String {
    return "Good Morning!"
}
let msg = greetUser()
print(msg)

Cuando ejecute el programa anterior, la salida será:

Good Morning!

En el programa anterior, ha definido el tipo de retorno como String. Ahora, la sentencia debe devolver una cadena desde dentro de la función, de lo contrario lanzará un error.

La palabra clave return transfiere el control del programa del cuerpo de la función a la llamada de la función. Si necesita devolver un valor desde la función, agregue el valor que desea devolver después de la palabra clave return.

La sentencia return "Good Morning!" devuelve un valor de tipo String desde la función. Tenga en cuenta que el tipo y el valor del valor de retorno deben coincidir.

También puede asignar el valor de retorno a una variable o constante. let msg = Asignar el valor de retorno a la constante msg. Por lo tanto, la sentencia print(msg) salida"Good Morning!"

Si desea ignorar este valor, simplemente use el subrayado _ , es decir, let _ = .

Funciones con parámetros pero sin valor de retorno

参数用于在函数中输入。参数包含参数名称和类型,后跟冒号(:)。这些类型的函数采用输入参数,但不返回值。

func funcname(parameterName: Type) {
    //Instrucciones
}

Ejemplo3:参数传递但没有返回值

func greetUser(msg: String) {
    print(msg)
}
greetUser(msg: "Good Morning!")

Cuando ejecute el programa anterior, la salida será:

Good Morning!

在上述程序中,该函数接受字符串类型的单个参数。该参数只能在函数内部使用。msg是参数的名称。

您可以通过向函数传递参数名称为 msg 的字符串值来调用函数 greetUser(msg: "Good Morning!")。该参数名称只在 greetUser() 函数内部可见。

因此,print(msg)语句输出 "Good Morning!"

具有参数和返回值的函数

这些类型的函数使用参数并返回值。

func funcname(parameterName: Type) -> ReturnType {
    //Instrucciones
}

Ejemplo4:传递参数并返回值

func greetUser(name: String) -> String {
    return "Good Morning! " + name
}
let msg = greetUser(name: "Jack")
print(msg)

Cuando ejecute el programa anterior, la salida será:

Good Morning! Jack

在上面的程序中,该函数接受String类型的单个参数,并且还返回String类型的值“Good Morning! Jack”。

具有多个参数和多个返回值的函数

这些类型的函数采用以逗号分隔的多个参数,并且还返回多个值。您可以使用元组在Swift中返回多个值。

func funcname(parameterName: Type, parameterName2: Type, ...) -> (ReturnType, ReturnType...) {
    //Instrucciones
}

Ejemplo5:传递了多个参数和多个返回值

func greetUser(name: String, age: Int) -> (String, Int) {
    
    let msg = "Good Morning!" + name
    var userage = age
    if age < 0 {
            userage = 0
    }
    return (msg, userage)
}
let msg = greetUser(name: "Jack", age: -2)
print(msg.0)
print("You have \(msg.1) coins left")

Cuando ejecute el programa anterior, la salida será:

Good Morning!Jack
You have 0 coins left

En el programa anterior, la función greetUser() acepta múltiples parámetros de tipo String y Int. La función también devuelve múltiples valores, de tipo String y Int.

Para acceder a cada valor de retorno, usamos la posición de índice 0,1, … Aquí, usamos msg.0 para acceder a "Good Morning!Jack" y msg.1 Acceder a "0".

El uso de posiciones de índice a veces puede ser poco intuitivo y de difícil lectura. Podemos resolver este problema de manera elegante nombrando los valores de retorno. El programa anterior también se puede rewrite de la siguiente manera.

Ejemplo6con múltiples valores de retorno

func greetUser(name: String, coins: Int) -> (name: String, coins: Int) {
    
    let msg = "Good Morning!" + name
    var userCoins = coins
    if coins < 0 {
        userCoins = 0
    }
    return (msg, userCoins)
}
let msg = greetUser(name: "Jack", coins: -2)
print(msg.name)
print("You have \(msg.coins) coins left")

En este programa, el tipo de retorno es una tupla que contiene nombres de variables con ese tipo. La principal ventaja de esto es que puede usar los nombres de variables msg.name y msg.coins en lugar de msg.0 y msg.1 para acceder a los resultados.

La función con etiqueta de parámetro

Al definir una función que recibe entrada, se puede definir el nombre de entrada con la ayuda del nombre del parámetro. Sin embargo, hay otro nombre que se puede usar junto con el nombre del parámetro, conocido como etiqueta de parámetro.

El uso de etiquetas de argumento permite llamar a la función de manera expresiva, similar a la manera de una oración, al mismo tiempo que proporciona un cuerpo de función legible y claro en términos de intención.

Cada parámetro de función tiene una etiqueta de parámetro y un nombre de parámetro. Por defecto, el parámetro usa su nombre de parámetro como su etiqueta de parámetro. Sin embargo, si define explícitamente el nombre del parámetro, se usará la etiqueta de parámetro al llamar a la función.

La sintaxis de una función con etiqueta de argumento es

func funcname(argumentLabel parameterName:Type)-> Tipo de retorno {
    //Instrucciones
}

Veamos esto en el siguiente ejemplo.

Ejemplo7func sum(a:Int, b:Int)

let result = sum(a: -> Int {
    
    return a + b
}
, b: 2Cuando llama a la función, puede notar que la llamada a la función no es expresiva 3)
print("La suma es \(result)")

Cuando ejecute el programa anterior, la salida será:

La suma es 5

función con mejor llamada pero no como nombre de parámetro

func sum(of:Int, and:Int)/return of

let result = sum(of: 2, and: 3)

and

Ejemplo8Ahora, la llamada al método es expresiva. Pero ahora debemos usar nombres de parámetros of&and, return of

función con mejor llamada pero no como nombre de parámetro -> Int {
    func sum(of:Int, and:Int) + return of
}
let result = sum(of: 2, and: 3)
print("La suma es \(result)")

and + and para encontrar la suma de dos números. Ahora, esto hace que el cuerpo de la función sea menos legible. Usar a y b en lugar de of&and en el cuerpo de la función será más significativo.

Para esto, debemos definir explícitamente las etiquetas de parámetro:

Ejemplo9función con etiquetas de parámetro

func sum(of a:Int, and b:Int) -> Int {
    return a + b
}
let result = sum(of: 2, and: 3)
print("La suma es \(result)")

En el programa anterior, la función acepta dos parámetros de tipo Int. La llamada a la función utiliza etiquetas de parámetro of&and, lo que también tiene más sentido al llamar a la función sum(of: 2, and: 3) en lugar de sum(a: 2, b: 3)。

Además, el cuerpo de la función utiliza los nombres de parámetros a y b, en lugar de of&and, lo que también tiene más sentido en operaciones aplicativas.

También puede omitir los etiquetas de parámetro escribiendo una subrayada _ delante del nombre del parámetro.

func sum(_ a:Int, _ b:Int) -> Int {
    return a + b
}
let result = sum(2, 3)
print("La suma es \(result)")

función con valor predeterminado de parámetro

Puede proporcionar un valor predeterminado para cualquier parámetro de una función, asignando un valor al parámetro después de su tipo. Proporcionar un valor predeterminado permite omitir el parámetro al llamar a la función.

Si no se pasa un valor a un parámetro al llamar a la función, se utiliza su valor predeterminado. Sin embargo, si se pasa un valor explícitamente a un parámetro al llamar, se utiliza el valor especificado.

func funcname(parameterName:Type = value) -> Tipo de retorno {
    //Instrucciones
}

Ejemplo10función con valor predeterminado de parámetro

func sum(of a:Int = 7, and b:Int = 8) -> Int {
    return a + b
}
let result1 = sum(of: 2, and: 3)
print("La suma es \(result"1))
let result2 = sum(of: 2)
print("La suma es \(result"2))
let result3 = sum(and: 2)
print("La suma es \(result"3))
let result4 = sum()
print("La suma es \(result"4))

Cuando ejecute el programa anterior, la salida será:

La suma es 5
La suma es 10
La suma es 9
La suma es 15

En el programa anterior, la función sum(of a :Int =}} 7 , and b:Int = 8) -> Int acepta dos parámetros de tipo Int y especifica el parámetro a=7y b=8el valor predeterminado.

Si se transmite value como parámetro en la llamada a la función, sum(of: 2, and: 3) se usa2y3en lugar del valor predeterminado del parámetro.

pero si no transmite el valor del parámetro como sum(), se utilizará el valor predeterminado7y8como valor de parámetro.

Función con parámetros variables

Los parámetros variables pueden aceptar cero o más valores de un tipo específico. Puede especificar un parámetro variable insertando tres puntos (...) después del nombre del tipo del parámetro.

Generalmente se utiliza parámetros variables cuando se necesita transmitir varias cantidades de valores de entrada a los parámetros en la llamada a la función. Por ejemplo, lista de números, lista de letras, etc.

La sintaxis de la función con parámetros variables es:

func funcname(parameterName: Type...) -> Tipo de retorno {
    //Instrucciones
}

Ejemplo11:función con parámetros variables

func sum(of numbers: Int...) {
    var result = 0
    for num in numbers {
        result += num
    }
    print("La suma de los números es \(result)")
}
sum(of: 1, 2, 3, 4, 5, 6, 7, 8)

En el programa anterior, la función sum(of numbers: Int...) acepta parámetros variables de tipo Int. Los parámetros variables pueden aceptar múltiples valores separados por comas sum(of: 1, 2, 3, 4, 5, 6, 7, 8)。

como valores transmitidos como parámetros variables1,2,3,4,5,6,7,8Se puede usar como array de tipo Int dentro del cuerpo de la función. Por lo tanto, podemos pasar for-in se aplica en el bucle for num in numbers.

Cuando ejecute el programa anterior, la salida será:

La suma de los números es 36

Nota: La función integrada print() de Swift también acepta parámetros variables de cualquier tipo.

Any representa cualquier tipo de datos en Swift, como Int, Float, Double, String, etc.

Función con parámetros de entrada y salida

Al definir parámetros de función, no se puede modificar el parámetro de la función dentro del cuerpo. Por lo tanto, por defecto, son constantes. Vamos a ver un ejemplo:

func process(name: String) {
    if name == ""{
        name = "guest"
    }
}

El programa anterior causará un error en tiempo de compilación porque no puede cambiar el valor del parámetro.

Si desea que la función modifique el valor del parámetro,则需要将参数定义为 in-Parámetro de salida. Puede escribir una entrada/parámetro de salida.

En segundo plano, un-El parámetro de salida tiene un valor que se transmite a la función, se modifica dentro de la función y luego se transmite de vuelta para reemplazar el valor original. Por lo tanto, el valor transmitido en la llamada a la función no puede ser una constante. Debe declararlo como una variable.

La sintaxis de las funciones con parámetros inout es:}}

func funcname(parameterName: inout Type) -> Tipo de retorno {
    //Instrucciones
}

Ejemplo12Método con parámetros inout

func process(name: inout String) { 
    if name == ""{
        name = "guest"
    }
}
var userName = ""
process(name: &userName)
print(userName)

Cuando ejecute el programa anterior, la salida será:

guest

En el programa anterior, declaramos una función que acepta parámetros inout para que se pueda modificar/Cambiar el parámetro name.

Al pasar parámetros a in-Cuando se pasa un parámetro out, debe usarse directamente el símbolo & delante del nombre de la variable para que la función pueda modificarlo.