No tienes acceso a esta clase

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

Capturar Valores

11/16
Recursos

Aportes 13

Preguntas 1

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

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

馃く

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

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

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

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:
[鈥淐鈥, 鈥淟鈥, 鈥滒煈光, 鈥淪鈥, 鈥滒煈光, 鈥淩鈥, 鈥滒煈光漖

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