Swift - Cierres
Los cierres en Swift 4 son similares a los de las funciones autónomas organizadas como bloques y llamadas en cualquier lugar, como los lenguajes C y Objective C. Las constantes y referencias de variables definidas dentro de las funciones se capturan y almacenan en cierres. Las funciones se consideran casos especiales de cierres y adoptan las tres formas siguientes:
Funciones globales | Funciones anidadas | Expresiones de cierre |
---|---|---|
Ten un nombre. No capture ningún valor | Ten un nombre. Capturar valores de la función adjunta | Los cierres sin nombre capturan valores de los bloques adyacentes |
Las expresiones de cierre en el lenguaje Swift 4 siguen estilos de sintaxis nítidos, optimizados y ligeros que incluyen.
- Inferir tipos de parámetros y valores de retorno a partir del contexto.
- Rendimientos implícitos de cierres de expresión única.
- Nombres de argumentos taquigráficos y
- Sintaxis de cierre final
Sintaxis
A continuación se muestra una sintaxis genérica para definir el cierre que acepta parámetros y devuelve un tipo de datos:
{
(parameters) −> return type in
statements
}
A continuación se muestra un ejemplo simple:
let studname = { print("Welcome to Swift Closures") }
studname()
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
Welcome to Swift Closures
El siguiente cierre acepta dos parámetros y devuelve un valor bool:
{
(Int, Int) −> Bool in
Statement1
Statement 2
---
Statement n
}
A continuación se muestra un ejemplo simple:
let divide = {
(val1: Int, val2: Int) -> Int in
return val1 / val2
}
let result = divide(200, 20)
print (result)
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
10
Expresiones en cierres
Las funciones anidadas proporcionan una forma conveniente de nombrar y definir bloques de código. En lugar de representar la declaración de función completa y las construcciones de nombre se utilizan para denotar funciones más cortas. La representación de la función en una declaración breve clara con sintaxis enfocada se logra mediante expresiones de cierre.
Programa de orden ascendente
La clasificación de una cadena se logra mediante la función reservada de teclas Swift 4s "sorted" que ya está disponible en la biblioteca estándar. La función ordenará las cadenas dadas en orden ascendente y devolverá los elementos en una nueva matriz con el mismo tamaño y tipo de datos mencionados en la matriz anterior. La matriz anterior sigue siendo la misma.
Dos argumentos están representados dentro de la función ordenada:
Valores de tipo conocido representados como matrices.
Arrastre el contenido (Int, Int) y devuelve un valor booleano (Bool) si la matriz está ordenada correctamente, devolverá un valor verdadero, de lo contrario, devolverá falso.
Una función normal con una cadena de entrada se escribe y se pasa a la función ordenada para ordenar las cadenas en la nueva matriz que se muestra a continuación:
func ascend(s1: String, s2: String) -> Bool {
return s1 > s2
}
let stringcmp = ascend(s1: "Swift 4", s2: "great")
print (stringcmp)
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
true
La matriz inicial que se clasificará para el helado se indica como "Swift 4" y "excelente". La función para ordenar la matriz se declara como tipo de datos de cadena y su tipo de retorno se menciona como booleano. Ambas cadenas se comparan y clasifican en orden ascendente y se almacenan en una nueva matriz. Si la clasificación se realiza correctamente, la función devolverá un valor verdadero; de lo contrario, devolverá falso.
La sintaxis de expresión de cierre utiliza:
- parámetros constantes,
- parámetros variables, y
- parámetros inout.
La expresión de cierre no admitía valores predeterminados. Los parámetros variables y las tuplas también se pueden utilizar como tipos de parámetros y tipos de retorno.
let sum = {
(no1: Int, no2: Int) -> Int in
return no1 + no2
}
let digits = sum(10, 20)
print(digits)
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
30
Los parámetros y las declaraciones de tipo de retorno que se mencionan en la declaración de la función también se pueden representar mediante la función de expresión de cierre en línea con la palabra clave 'in'. Una vez que se declaran los tipos de parámetro y retorno, la palabra clave 'in' se usa para indicar que el cuerpo del cierre.
Rendimientos implícitos de una sola expresión
Aquí, el tipo de función del segundo argumento de la función ordenada deja claro que el cierre debe devolver un valor bool. Debido a que el cuerpo del cierre contiene una sola expresión (s1> s2) que devuelve un valor bool, no hay ambigüedad y la palabra clave return se puede omitir.
Para devolver una declaración de expresión única en cierres de expresión, se omite la palabra clave 'return' en su parte de declaración.
var count:[Int] = [5, 10, -6, 75, 20]
let descending = count.sorted(by: { n1, n2 in n1 > n2 })
let ascending = count.sorted(by: { n1, n2 in n1 < n2 })
print(descending)
print(ascending)
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
[75, 20, 10, 5, -6]
[-6, 5, 10, 20, 75]
La declaración en sí define claramente que cuando cadena1 es mayor que cadena 2, devuelve verdadero; de lo contrario, es falsa, por lo que la declaración de devolución se omite aquí.
Cierres de tipo conocido
Considere la suma de dos números. Sabemos que la suma devolverá el tipo de datos entero. Por lo tanto, los cierres de tipo conocido se declaran como:
let sub = {
(no1: Int, no2: Int) -> Int in
return no1 - no2
}
let digits = sub(10, 20)
print(digits)
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
-10
Declaración de nombres de argumentos taquigráficos como cierres
Swift 4 proporciona automáticamente nombres abreviados de argumentos a los cierres en línea, que se pueden usar para hacer referencia a los valores de los argumentos del cierre con los nombres $ 0, $ 1, $ 2, etc.
var shorthand: (String, String) -> String
shorthand = { $1 }
print(shorthand("100", "200"))
Aquí, $ 0 y $ 1 se refieren al primer y segundo argumento String del cierre.
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
200
Swift 4 facilita al usuario representar cierres en línea como nombres de argumentos abreviados al representar $ 0, $ 1, $ 2 --- $ n.
La lista de argumentos de cierres se omite en la sección de definición cuando representamos nombres abreviados de argumentos dentro de expresiones de cierre. Según el tipo de función, se derivarán los nombres abreviados de los argumentos. Dado que el argumento abreviado se define en el cuerpo de la expresión, se omite la palabra clave 'in'.
Cierres como funciones del operador
Swift 4 proporciona una manera fácil de acceder a los miembros simplemente proporcionando funciones de operador como cierres. En los ejemplos anteriores, la palabra clave 'Bool' se usa para devolver 'verdadero' cuando las cadenas son iguales; de lo contrario, devuelve 'falso'.
La expresión se hace aún más simple por la función del operador en el cierre como -
let numb = [98, -20, -30, 42, 18, 35]
var sortedNumbers = numb.sorted ({
(left: Int, right: Int) -> Bool in
return left < right
})
let asc = numb.sorted(<)
print(asc)
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
[-30, -20, 18, 35, 42, 98]
Cierres como remolques
Pasar el argumento final de la función a una expresión de cierre se declara con la ayuda de 'Trailing Closures'. Está escrito fuera de la función () con {}. Su uso es necesario cuando no es posible escribir la función en línea en una sola línea.
reversed = sorted(names) { $0 > $1}
donde {$ 0> $ 1} se representan como cierres finales declarados fuera de (nombres).
import Foundation
var letters = ["North", "East", "West", "South"]
let twoletters = letters.map({
(state: String) -> String in
return state.substringToIndex(advance(state.startIndex, 2)).uppercaseString
})
let stletters = letters.map() {
$0.substringToIndex(advance($0.startIndex, 2)).uppercaseString
}
print(stletters)
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
[NO, EA, WE, SO]
Captura de valores y tipos de referencia
En Swift 4, la captura de constantes y valores de variables se realiza con la ayuda de cierres. Además, hace referencia y modifica los valores de esas constantes y variables dentro del cuerpo de cierre, aunque las variables ya no existan.
La captura de valores constantes y variables se logra mediante el uso de la función anidada escribiendo función en el cuerpo de otra función.
Una función anidada captura:
- Argumentos de funciones externas.
- Capture constantes y variables definidas dentro de la función Outer.
En Swift 4, cuando se declara una constante o variable dentro de una función, el cierre también crea automáticamente una referencia a esas variables. También proporciona la posibilidad de hacer referencia a más de dos variables como el mismo cierre de la siguiente manera:
let decrem = calcDecrement(forDecrement: 18)
decrem()
aquí oneDecrement y las variables de Decremento apuntarán al mismo bloque de memoria como referencia de cierre.
func calcDecrement(forDecrement total: Int) -> () -> Int {
var overallDecrement = 100
func decrementer() -> Int {
overallDecrement -= total
print(overallDecrement)
return overallDecrement
}
return decrementer
}
let decrem = calcDecrement(forDecrement: 18)
decrem()
decrem()
decrem()
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
82
64
46
Cuando todas y cada una de las veces que se llama a la función externa calcDecrement, invoca la función decrementer () y disminuye el valor en 18 y devuelve el resultado con la ayuda de la función externa calcDecrement. Aquí calcDecrement actúa como un cierre.
Aunque la función decrementer () no tiene ningún argumento, el cierre por defecto se refiere a las variables 'globalDecrement' y 'total' capturando sus valores existentes. La copia de los valores de las variables especificadas se almacena con la función new decrementer (). Swift 4 maneja las funciones de administración de memoria al asignar y desasignar espacios de memoria cuando las variables no están en uso.