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 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 adopta las tres formas siguientes−
Funciones globales | Funciones anidadas | Expresiones de cierre |
---|---|---|
Ten un nombre. No capture ningún valor | Que tenga un nombre. Capturar valores de la función de cierre | Cierres sin nombre capturar valores de los bloques adyacentes |
Las expresiones de cierre en lenguaje Swift 4 siguen estilos de sintaxis nítidos, optimizados y ligeros que incluyen.
- Inferir tipos de parámetros y valores devueltos desde el contexto.
- Retornos implícitos de cierres de expresión única.
- Nombres de argumento abreviados y
- Sintaxis de cierre final
Sintaxis
A continuación se muestra una sintaxis genérica para definir cierre que acepta parámetros y devuelve un tipo de datos−
{ (parameters) −> return type in statements}
A continuación se muestra un ejemplo sencillo−
let studname = { print("Welcome to Swift Closures") }studname()
Cuando ejecutamos el programa anterior usando playground, obtenemos el siguiente resultado−
Welcome to Swift Closures
El cierre siguiente 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 sencillo−
let divide = { (val1: Int, val2: Int) -> Int in return val1 / val2 }let result = divide(200, 20)print (result)
Cuando ejecutamos el programa anterior usando playground, 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 toda la declaración de función 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 y clara con sintaxis enfocada se logra a través de expresiones de cierre.
Programa de orden ascendente
Ordenar una cadena se logra mediante la función reservada de clave 4s de Swift «ordenada» que ya está disponible en la biblioteca estándar. La función ordenará las cadenas dadas en orden ascendente y devuelve los elementos en una nueva matriz con el mismo tamaño y tipo de datos mencionados en la matriz anterior. La vieja matriz sigue siendo la misma.
Se representan dos argumentos dentro de la función ordenada−
-
Valores de tipo conocido representados como matrices.
-
El Array contiene (Int, Int) y devuelve un valor booleano (Bool) si el array está ordenado correctamente, devolverá el valor verdadero, de lo contrario devolverá false.
Una función normal con cadena de entrada se escribe y se pasa a la función ordenada para obtener las cadenas ordenadas en una 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 utilizando playground, obtenemos el siguiente resultado−
true
La matriz inicial que se ordenará para helado se da como «Swift 4″y » genial». 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 ordenan en orden ascendente y se almacenan en una nueva matriz. Si la ordenación se realiza correctamente, la función devolverá un valor verdadero, de lo contrario devolverá false.
Usos de la sintaxis de expresión de cierre−
- parámetros constantes, parámetros variables
- y parámetros inout
- .
La expresión de cierre no admitía valores predeterminados. Los parámetros variádicos y las tuplas también se pueden usar 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 utilizando playground, obtenemos el siguiente resultado−
30
Los parámetros y las declaraciones de tipo de retorno mencionadas en la declaración de 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 declara el parámetro y los tipos de retorno, se usa la palabra clave ‘in’ para denotar que el cuerpo del cierre.
La expresión única Devuelve implícita
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 sola instrucción de expresión en cierres de expresión, la palabra clave’ return ‘ se omite en su parte de declaración.
var count: = 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 utilizando playground, obtenemos el siguiente resultado−
La instrucción en sí define claramente que cuando string1 es mayor que string 2 devuelve verdadero, de lo contrario falso, por lo tanto, la instrucción return se omite aquí.
Cierres de tipo conocido
Considere la adición 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 playground, obtenemos el siguiente resultado−
-10
Declarar Nombres de argumento abreviado como Cierres
Swift 4 proporciona automáticamente nombres de argumento abreviado a cierres en línea, que se pueden usar para referirse a los valores de los argumentos del cierre por los nombres 0 0, 1 1,. 2, etc.
var shorthand: (String, String) -> Stringshorthand = { }print(shorthand("100", "200"))
Aquí, $0 y 1 1 se refieren a los argumentos de primera y segunda cadena del cierre.
Cuando ejecutamos el programa anterior utilizando playground, obtenemos el siguiente resultado−
200
Swift 4 facilita al usuario representar cierres en línea como nombres de argumento abreviados al representar $0, $1, $2 — $n.
La lista de argumentos de cierre se omite en la sección definición cuando representamos nombres de argumento abreviados dentro de expresiones de cierre. En función del tipo de función, se derivarán los nombres de los argumentos abreviados. Dado que el argumento abreviado está definido en el cuerpo de la expresión, se omite la palabra clave ‘in’.
Cierres como funciones del operador
Swift 4 proporciona una forma fácil de acceder a las barras simplemente proporcionando funciones del operador como cierres. En los ejemplos anteriores, la palabra clave ‘Bool’ se usa para devolver ‘true’ cuando las cadenas son iguales, de lo contrario devuelve ‘false’.
La expresión se simplifica aún más mediante la función del operador en el cierre como−
let numb = 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 playground, obtenemos el siguiente resultado−
Cierres como Remolques
Pasar el argumento final de la función a una expresión de cierre se declara con la ayuda de ‘Cierres finales’. Se escribe 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) { > }
donde {{0 >} 1} se representan como cierres finales declarados fuera (nombres).
import Foundationvar letters = let twoletters = letters.map({ (state: String) -> String in return state.substringToIndex(advance(state.startIndex, 2)).uppercaseString})let stletters = letters.map() { .substringToIndex(advance(.startIndex, 2)).uppercaseString }print(stletters)
Cuando ejecutamos el programa anterior utilizando playground, obtenemos el siguiente resultado−
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 la función con en el cuerpo de otra función.
Captura de una función anidada−
- Argumentos de función externos.
- Captura constantes y variables definidas dentro de la función externa.
En Swift 4, cuando se declara una constante o una variable dentro de una función, la referencia a esas variables también se crea automáticamente mediante el cierre. También proporciona la facilidad de referir más de dos variables como el mismo cierre de la siguiente manera−
let decrem = calcDecrement(forDecrement: 18)decrem()
Aquí, las variables de un solo requisito y 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 utilizando playground, obtenemos el siguiente resultado−
826446
Cuando cada vez que se llama a la función externa calcDecrement, invoca a la función decrementer() y decrementa el valor en 18 y devuelve el resultado con la ayuda de la función externa calcDecrement. Aquí calcEdimiento actúa como un cierre.
Aunque la función decrementer () no tiene ningún argumento, el cierre por defecto se refiere a las variables ‘overallDecrement’ y ‘total’ capturando sus valores existentes. La copia de los valores de las variables especificadas se almacena con la nueva función decrementer (). Swift 4 maneja las funciones de administración de memoria asignando y desasignando espacios de memoria cuando las variables no están en uso.