No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Capturar Valores

11/16
Recursos

Aportes 12

Preguntas 0

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

{(馃馃徎鈥嶐煉) -> () -> 馃懝}

Esto a las 4:33 a.m. es del diablo, hahaha.

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 incrementBySeven es 7


incrementByTen()

El valor de incrementByTen ahora es 40, ya que mantiene el valor anterior (30)

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

馃く

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 馃槃

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())

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.

  1. El runningTotal est谩 declarado dentro de incrementByTen
    .
  2. Cada 鈥渧ariable鈥 ( = func -> closure) tiene variables locales 鈥渃apturadas鈥 por el closure
    .
  3. Llamar a incrementByTen() , es como llamar a incrementer() que por debajo solo hace referencia a la variable local runningTotal , sumarle el amount (que tambi茅n queda capturada) y retornar la suma.
    |
  4. amount no cambia y runningTotal es cambiada por el closure.
    |
    al inicio puede marear un poco 馃槃

Tiene un funcionamiento como el closure de javascript

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
    }
}

Terminado el ejercicio diabolico jaja:
[鈥淐鈥, 鈥淟鈥, 鈥滒煈光, 鈥淪鈥, 鈥滒煈光, 鈥淩鈥, 鈥滒煈光漖

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())