Capturar Valores
Clase 11 de 16 • Curso de Programación con Swift: Funciones (2019)
Contenido del curso
Clase 11 de 16 • Curso de Programación con Swift: Funciones (2019)
Contenido del curso
Sebastian Garcia Ospina
Jesús Henríquez
Rene Eduardo Corrales Torrez
Jorge Antonio Martínez Tejeda
Hernán Chilabert
David Barreto
Gera Meraki
José Javier Cueto Mejía
Isaac Sánchez
Antonio Luis Gil Rodríguez
Felipe Andres Sánchez Gomez
Andy Antonio Paz Cambara
Luis Felipe Carrasco Galindo
Adrian Peralta
George M
Luis Garay
Paúl Terán
Esto a las 4:33 a.m. es del diablo, hahaha.
Cuando te despiertes lo tendrás fresco jajaja
{(🧑🏻💻) -> () -> 👹}
Es verdad jajajaja
Pero ya por fin le he entendido a esta clase después de verla dos veces :P
Resumen
Los closures capturan el ambiente en el que fueron creados, lo que significa que toman una copia de los valores que son usados dentro de ellos.
func makeIncrementer(forIncrement amount: Int) -> () -> Int { var runningTotal = 0 func incrementer() -> Int { runningTotal += amount return runningTotal } return incrementer } let incrementByTen = makeIncrementer(forIncrement: 10) incrementByTen() // 10 incrementByTen() // 20 incrementByTen() // 30
Es por eso que cuando se vuelve a invocar a la función makeIncrementer() pero con otro valor (7), el resultado de la anterior se mantiene.
let incrementBySeven = makeIncrementer(forIncrement: 7) incrementBySeven() // 7
El valor de
incrementBySevenes 7
incrementByTen()
El valor de
incrementByTenahora es 40, ya que mantiene el valor anterior (30)
Genial tu resumen! 👍
Realmente este modulo se me ha hecho muy complicado, creo que mas que toda esta carrera de ios (Hasta el momento). Pero con esta clase me quedo todo mas claro.
Recuerden que lo mas importante es practicar y picarle a las cosas
🤯
Por tanto cada vez que yo creo una variable a partir de llamar a una función que me devuelve un clousure, o que me devuelve una función a su vez, cada una de ellas tiene sus variables locales capturadas por el clousure.
Otra forma más simplificada, aunque no tan legible, pero lo dejo como opción:
func makeIncrementer(forIncrement amount: Int) -> () -> Int { var runningTotal = 0 return { runningTotal += amount return runningTotal } }
Tiene un funcionamiento como el closure de javascript
probe hacer un closure donde guardara el promedio de las clases y pues les comparto mi resultado :
func promedio(_ notaUno: Int, _ notaDos: Int, _ notaTres: Int) -> Int { var promedioNota = 0 func promediar() -> Int{ promedioNota = (notaUno + notaDos + notaTres) / 3 return promedioNota } return promediar() } let matematica = promedio(60, 50, 60) let lenguaje = promedio(45, 60, 70) let programacion = promedio(100, 90, 80) print("el promedio de matematica es: \(matematica)") print("el promedio de lenguaje es: \(lenguaje)") print("el promedio de programación es: \(programacion)")
desarrollé una función que calcula el IVA por precio y otro que calcula el IVA mediante una lista de precios o productos.
espero feedback :D
func calculateIvaTotalProducts(_ product: Int) -> () -> Int{ var totalIva = 0.0 let IVA = 0.19 func calculateIvaByProduct() -> Int{ totalIva = Double(product) * IVA return product + Int(totalIva) } return calculateIvaByProduct } let productCaculate = calculateIvaTotalProducts(2000) productCaculate() func calculateIVAListProducts(listProduct products: [Int]) -> () -> Int{ var totalWithIVA = 0 let IVA = 0.19 func calculateIVAProducts() -> Int { for product in products { let IVAProduct = Double(product) * IVA totalWithIVA += product + Int(IVAProduct) } return totalWithIVA } return calculateIVAProducts } let purchasesOfWeek = calculateIVAListProducts(listProduct: [2000, 3000, 5000, 10000]) print(purchasesOfWeek())
Hola, Como es que el var runningTotal = 0 no se inicializa en cada vez que llamamos a la funcion? no me queda muy claro como guarda el "estado" y no se inicializa en cada llamada gracias un saludo
Siguiendo la misma logica se puede hacer un Decreaser. Donde puedes restar e ir reduciendo cada vez mas en los números negativos.
func makeDecreaser(amount:Int) -> () -> Int{ var runningTotal = 0 func decreaser () -> Int{ runningTotal -= amount return runningTotal } return decreaser } let decreaseBy10 = makeDecreaser(amount: 10) decreaseBy10() decreaseBy10()
Terminado el ejercicio diabolico jaja: ["C", "L", "👹", "S", "👹", "R", "👹"]
func makeClosurePhrase(phrase collection: [String]) -> () -> [String] { let filteredLetters = ["a", "e", "i", "o", "u", "A", "E", "I", "O", "U"] var finalArray = [String]() func replaceCharacters() -> [String] { for item in collection { if filteredLetters.contains(item) { finalArray.append("👹") }else { finalArray.append(item) } } return finalArray } return replaceCharacters } let originalString = ["C", "L", "O", "S", "U", "R", "E"] var resultPhrase = makeClosurePhrase(phrase: originalString) print(resultPhrase())