Swift Funciones

Las funciones de Swift son bloques de código independientes que se utilizan para realizar tareas específicas.

Swift utiliza una sintaxis unificada para representar desde funciones simples de estilo C hasta métodos complejos de estilo Objective-C.

  • Declaración de la función: le dice al compilador el nombre de la función, el tipo de retorno y los parámetros.

  • Definición de la función: proporciona el cuerpo de la función.

Las funciones de Swift incluyen el tipo de los parámetros y el tipo del valor de retorno:


Definición de la función

Swift define funciones usando la palabra clavefunc。

Al definir una función, se pueden especificar uno o más parámetros de entrada y un tipo de valor de retorno.

Cada función tiene un nombre que describe su funcionalidad. Se llama a esta función mediante el nombre y los valores de los parámetros de tipo correspondiente. El orden de paso de los parámetros de la función debe ser el mismo que el de la lista de parámetros.

El orden de paso de los argumentos reales debe ser el mismo que el de la lista de parámetros formales,->y luego se define el tipo de retorno de la función.

Sintaxis

func funcname(形参) -> returntype
{
   Statement1
   Statement2
   ……
   Statement N
   return parameters
}

Ejemplo

A continuación definimos una función llamada `ejemplo`, con un parámetro formal de tipo `String` y un valor de retorno también de tipo `String`:

import Cocoa

func ejemplo(site: String) -> String {
    return (site)
}
print(ejemplo(site: "www.example.com"))

El resultado de la ejecución del programa anterior es:

www.example.com

Llamada a la función

Podemos llamar a la función mediante el nombre y los valores de parámetros del tipo correspondiente. El orden de paso de los parámetros de la función debe ser el mismo que el de la lista de parámetros.

A continuación definimos una función llamada `ejemplo`, cuyo parámetro formal `site` es de tipo `String`. Luego, el argumento real que pasamos al llamar a la función también debe ser de tipo `String`. Una vez que el argumento entra en el cuerpo de la función, se devuelve directamente, y el tipo de dato devuelto es `String`.

import Cocoa

func ejemplo(site: String) -> String {
    return (site)
}
print(ejemplo(site: "www.example.com"))

El resultado de la ejecución del programa anterior es:

www.example.com

Parámetros de la función

Una función puede aceptar uno o más parámetros. Estos parámetros se incluyen entre paréntesis de la función y se separan por comas.

En el siguiente ejemplo, se pasan a la función `ejemplo` el nombre del sitio `name` y la dirección del sitio `site`:

import Cocoa

func ejemplo(name: String, site: String) -> String {
    return name + site
}
print(ejemplo(name: "Ejemplo:", site: "www.example.com"))
print(ejemplo(name: "Google:", site: "www.google.com"))

El resultado de la ejecución del programa anterior es:

Ejemplo:www.example.com
Google:www.google.com

Funciones sin parámetros

Podemos crear funciones sin parámetros.

Sintaxis:

func funcname() -> datatype {
   return datatype
}

Ejemplo

import Cocoa

func sitename() -> String {
    return "Ejemplo"
}
print(sitename())

El resultado de la ejecución del programa anterior es:

Tutorial para principiantes

Tupla como valor de retorno de la función

El tipo de valor de retorno de una función puede ser cadena, entero, punto flotante, etc.

Las tuplas son similares a los arrays; la diferencia es que los elementos de una tupla pueden ser de cualquier tipo y se utilizan paréntesis.

Puedes usar el tipo tupla para que varios valores se devuelvan desde una función como un valor compuesto.

En el siguiente ejemplo, se define una función llamada `minMax(_:)`, cuya función es encontrar el valor mínimo y el máximo en un array de tipo `Int`.

import Cocoa

func minMax(array: [Int]) -> (min: Int, max: Int) {
    var currentMin = array[0]
    var currentMax = array[0]
    for value in array[1..<array.count] {
        if value < currentMin {
            currentMin = value
        } else if value > currentMax {
            currentMax = value
        }
    }
    return (currentMin, currentMax)
}

let bounds = minMax(array: [8, -6, 2, 109, 3, 71])
print("最小值为 \(bounds.min) ,最大值为 \(bounds.max)")

La función `minMax(_:)` devuelve una tupla que contiene dos valores `Int`, etiquetados como `min` y `max`, de modo que, al consultar el valor de retorno de la función, se pueda acceder a ellos por nombre.

El resultado de la ejecución del programa anterior es:

最小值为 -6 ,最大值为 109

Si no estás seguro de que la tupla devuelta no sea `nil`, puedes devolver un tipo de tupla opcional.

Puedes definir una tupla opcional colocando un signo de interrogación después del paréntesis derecho del tipo de tupla, por ejemplo `(Int, Int)?` o `(String, Int, Bool)?`

Nota
Un tipo de tupla opcional como(Int, Int)?y una tupla que contiene tipos opcionales como(Int?, Int?)son diferentes. En un tipo de tupla opcional, toda la tupla es opcional, no solo cada valor de elemento de la tupla.

La anteriorminMax(_:)función devolvió una tupla que contiene dosIntvalores. Sin embargo, la función no realiza ninguna comprobación de seguridad sobre el array pasado. Siarrayel parámetro es un array vacío, el definido anteriormenteminMax(_:)al intentar acceder aarray[0]se producirá un error en tiempo de ejecución.

Para manejar de forma segura este problema de "array vacío", seminMax(_:)reescribe la función para que use un tipo de retorno de tupla opcional y, cuando el array esté vacío, devuelvanil:

import Cocoa

func minMax(array: [Int]) -> (min: Int, max: Int)? {
    if array.isEmpty { return nil }
    var currentMin = array[0]
    var currentMax = array[0]
    for value in array[1..<array.count] {
        if value < currentMin {
            currentMin = value
        } else if value > currentMax {
            currentMax = value
        }
    }
    return (currentMin, currentMax)
}
if let bounds = minMax(array: [8, -6, 2, 109, 3, 71]) {
    print("最小值为 \(bounds.min),最大值为 \(bounds.max)")
}

El resultado de la ejecución del programa anterior es:

最小值为 -6,最大值为 109

Funciones sin valor de retorno

A continuación se muestra otra versión de la función `ejemplo(_:)`. Esta función recibe como parámetro la dirección web oficial de Ejemplo, no especifica un tipo de valor de retorno y genera directamente el valor `String` en lugar de devolverlo:

import Cocoa

func ejemplo(site: String) {
    print("Ejemplo官网:\(site)")
}
ejemplo(site: "http://www.example.com")

El resultado de la ejecución del programa anterior es:

Ejemplo官网:http://www.example.com

Nombres de los parámetros de la función

Los parámetros de una función tienen un nombre de parámetro externo y un nombre de parámetro local.

Nombre de parámetro local

El nombre de parámetro local se utiliza dentro de la implementación de la función.

func sample(number: Int) {
   println(number)
}

En el ejemplo anterior, `number` es el nombre de parámetro local y solo se puede usar dentro del cuerpo de la función.

import Cocoa

func sample(number: Int) {
    print(number)
}
sample(number: 1)
sample(number: 2)
sample(number: 3)

El resultado de la ejecución del programa anterior es:

1
2
3

Nombre de parámetro externo

Puedes especificar un nombre de parámetro externo delante del nombre de parámetro local, separándolos con un espacio. El nombre de parámetro externo se utiliza al llamar a la función para pasar el parámetro a la función.

A continuación puedes definir los siguientes dos nombres de parámetros de función y llamarla:

import Cocoa

func pow(firstArg a: Int, secondArg b: Int) -> Int {
   var res = a
   for _ in 1..<b {
      res = res * a
   }
   print(res)
   return res
}
pow(firstArg:5, secondArg:3)

El resultado de la ejecución del programa anterior es:

125

Nota
Si proporcionas un nombre de parámetro externo, al llamar a la función debes usar dicho nombre de parámetro externo.


Parámetros variádicos

Los parámetros variádicos pueden aceptar cero o más valores. Al llamar a una función, puedes usar un parámetro variádico para especificar los parámetros de la función, cuya cantidad es indefinida.

Los parámetros variádicos se definen añadiendo `(...)` después del nombre del tipo de variable.

import Cocoa

func vari<N>(members: N...){
    for i in members {
        print(i)
    }
}
vari(members: 4,3,5)
vari(members: 4.5, 3.1, 5.6)
vari(members: "Google", "Baidu", "Ejemplo")

El resultado de la ejecución del programa anterior es:

4
3
5
4.5
3.1
5.6
Google
Baidu
Ejemplo

Constantes, variables y parámetros de E/S

Por lo general, los parámetros definidos en una función son, por defecto, parámetros constantes. Es decir, solo puedes consultarlos y usarlos, pero no cambiar su valor.

Si quieres declarar un parámetro variable, puedes añadir la palabra clave `inout` delante de la definición del parámetro, de modo que puedas cambiar el valor de este parámetro.

Por ejemplo:

func  getName(_ name: inout String).........

En este momento, el valor `name` se puede cambiar dentro de la función.

Generalmente, el paso de parámetros por defecto es por valor, no por referencia. Por lo tanto, si el parámetro pasado se modifica dentro de la función, no afecta al parámetro original. Lo que se pasa es solo una copia de este parámetro.

Cuando el parámetro pasado es un parámetro de entrada y salida, es necesario añadir el símbolo `&` delante del nombre del parámetro, lo que indica que este valor puede ser modificado por la función.

Ejemplo

import Cocoa

func swapTwoInts(_ a: inout Int, _ b: inout Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}


var x = 1
var y = 5
swapTwoInts(&x, &y)
print("x 现在的值 \(x), y 现在的值 \(y)")

La función `swapTwoInts(_:_:)` simplemente intercambia los valores de `a` y `b`. Primero almacena el valor de `a` en una constante temporal `temporaryA`, luego asigna el valor de `b` a `a` y, por último, asigna `temporaryA` a `b`.

Es importante señalar que `someInt` y `anotherInt` llevan el prefijo `&` antes de pasarse a la función `swapTwoInts(_:_:)`.

El resultado de la ejecución del programa anterior es:

x 现在的值 5, y 现在的值 1

Tipos de función y su uso

Cada función tiene un tipo de función específico, compuesto por el tipo de los parámetros y el tipo de retorno de la función.

func inputs(no1: Int, no2: Int) -> Int {
   return no1/no2
}

La función `inputs` tiene un tipo de función con dos parámetros de tipo `Int` (`no1`, `no2`) y devuelve un valor de tipo `Int`.

El ejemplo es el siguiente:

import Cocoa

func inputs(no1: Int, no2: Int) -> Int {
    return no1/no2
}
print(inputs(no1: 20, no2: 10))
print(inputs(no1: 36, no2: 6))

El resultado de la ejecución del programa anterior es:

2
6

La función anterior define dos parámetros de tipo `Int` y el valor de retorno también es de tipo `Int`.

A continuación, veamos la siguiente función. La función define un parámetro de tipo `String` y devuelve un valor de tipo `String`.

func inputstr(name: String) -> String {
   return name
}

Una función también puede definirse sin parámetros y sin valor de retorno, como se muestra a continuación:

import Cocoa

func inputstr() {
   print("Ejemplo")
   print("www.example.com")
}
inputstr()

El resultado de la ejecución del programa anterior es:

Ejemplo
www.example.com

Usar tipos de función

En Swift, usar un tipo de función es igual que usar otros tipos. Por ejemplo, puedes definir una constante o variable cuyo tipo sea una función y asignarle la función adecuada:

var addition: (Int, Int) -> Int = sum

Análisis:

Definir una variable llamadaadditioncuyos tipos de parámetro y retorno son ambosInty haz que esta nueva variable apunte a lasumfunción

sumyadditionTienen el mismo tipo, por lo que la operación anterior es válida.

Ahora, puedes usar `addition` para llamar a la función asignada:

import Cocoa

func sum(a: Int, b: Int) -> Int {
   return a + b
}
var addition: (Int, Int) -> Int = sum
print("输出结果: \(addition(40, 89))")

El resultado de la ejecución del programa anterior es:

输出结果: 129

Tipo de función como tipo de parámetro, tipo de función como tipo de retorno

Podemos pasar una función como parámetro a otro parámetro:

import Cocoa

func sum(a: Int, b: Int) -> Int {
    return a + b
}
var addition: (Int, Int) -> Int = sum
print("输出结果: \(addition(40, 89))")

func another(addition: (Int, Int) -> Int, a: Int, b: Int) {
    print("输出结果: \(addition(a, b))")
}
another(addition: sum, a: 10, b: 20)

El resultado de la ejecución del programa anterior es:

输出结果: 129
输出结果: 30

Funciones anidadas

El anidamiento de funciones se refiere a definir una nueva función dentro de otra función; la función externa puede llamar a la función definida en su interior.

El ejemplo es el siguiente:

import Cocoa

func calcDecrement(forDecrement total: Int) -> () -> Int {
   var overallDecrement = 0
   func decrementer() -> Int {
      overallDecrement -= total
      return overallDecrement
   }
   return decrementer
}
let decrem = calcDecrement(forDecrement: 30)
print(decrem())

El resultado de ejecución del programa anterior es:

-30
Otras extensiones