@discardableResult
Clase 21 de 46 • Curso de Swift 4 2018
Contenido del curso
Edward Fernandez
Duwal Abel Varillas Castro
Alejandro Sol Villaseñor
Manuel Alejandro Aguilar Téllez Girón
Manuel Alejandro Aguilar Téllez Girón
Matias La Delfa
Andrés Carrillo
Edgar Rodriguez
Mateo Oviedo Torres
Rodrigo Guerra Castilla
Daniel Alejandro Contreras Suárez
Francisco Leví Méndez Delgado
José Francisco Casales Huerta
Jonathan Macalupu Reyes
Agustin Olmedo
Vespaciano Forero Sanchez
Edward Alberto Caro Contreras
Sebastián Barre
Daniel Alcudia
Julio Domingo Garcia
Luis Capdevila
Jose Miguel Serrato Moreno
Marcos Avila Rodriguez
Nyxent Corp
Hola chicos, estuve investigando acerca del @discardableResult y pude encontrar que: este atributo debo aplicarlo a una función o declaración de método para suprimir la advertencia del compilador cuando se llame la rutina que devuelve un valor sin usar su resultado.
Les dejo el link para que lo revisen:
Hola quería saber si en alguna oportunidad tuviste la necesidad de usar el @discardableResult , sucede que yo lo use con el ejemplo del profesor pero al retirarle el @discardableResult en diversas situaciones e notado que no hay la necesidad de usarlo al menos en ejemplo que el profesor da es por esto que me puse a investigar y también vi el link que mandaste pero aun así quisiera ver un ejemplo real en el que necesite de @discardableResult para poder comprenderlo mejor pues si no veo una situación así no siento que entendí este tema y es muy frustrante. Agradesco de antemano y saludos
El atributo @discardableResult es útil cuando tienes un proyecto más extenso por cuestiones de optimización de memoria. No siempre es muy utilizado, el profesor lo explico para fines prácticos. Pero se basa en la optimización de memoria.
Aquí está mi código del reto:
var saldoDespacho: Float = 1_500.0 var transactions: [Float] = [1.2, 5, 6, 9.5, 2.3] @discardableResult func addTransaction(valorTransaccion valor: Float?) -> (saldoResultante: Float, exito: Bool) { guard let valor = valor else { return (saldoDespacho, false) } if (saldoDespacho - valor) < 0{ return (saldoDespacho, false) } else { transactions.append(valor) let totalTransactions: Float = transactions.reduce(0.0, +) if (saldoDespacho - totalTransactions) < 0{ return(saldoDespacho, false) } else { saldoDespacho -= totalTransactions } } return(saldoDespacho, true) } let saldoFinal = addTransaction(valorTransaccion: 23.5) print(saldoFinal.saldoResultante, saldoFinal.exito)
La idea principal fue que pensara si puede hacer la operación con el valor individual, de ser así procede a asignar el valor al arreglo, después hace las operaciones pertinentes de resta al saldo, al no poder asignar el valor al arreglo, le resta los valores que ya estaban, me imprime esto:
1452.5 true
Y aquí con un diccionario:
var saldoDespacho: Float = 1_500.0 var transaccionEnero: [String: [Float]] = [ "Lunes": [10, 6, 8], "Martes": [32, 56, 9.7], "Miércoles": [13.7, 49.6, 14], "Jueves": [13, 14, 5] ] @discardableResult func addTransaction(valorTransaccion valor: Float?) -> (saldoResultante: Float, exito: Bool) { var totalTransactions: Float = 0 guard let valor = valor else { return (saldoDespacho, false) } if (saldoDespacho - valor) < 0{ return (saldoDespacho, false) } else { transaccionEnero.updateValue([valor], forKey: "Sábado") for key in transaccionEnero.keys{ let arr = transaccionEnero[key]! totalTransactions += arr.reduce(0.0, +) } if (saldoDespacho - totalTransactions) < 0{ return(saldoDespacho, false) } else { saldoDespacho -= totalTransactions } } return(saldoDespacho, true) } let saldoFinal = addTransaction(valorTransaccion: 5.0) print(saldoFinal.saldoResultante, saldoFinal.exito) print(transaccionEnero)
Y me imprime:
1264.0 true ["Miércoles": [13.7, 49.6, 14.0], "Jueves": [13.0, 14.0, 5.0], "Martes": [32.0, 56.0, 9.7], "Sábado": [5.0], "Lunes": [10.0, 6.0, 8.0]]
Aunque todavía no sé porqué se imprime el diccionario desordenado 😦
No le termino de entender a Andres, a mi gusto le hace falta mayor claridad al curso
Es cuestión de perspectiva, yo me quejaba al principio de lo mismo pero al ver que en internet hay muy pocos cursos en español que valen la pena (todos están incompletos y son malos) hice el esfuerzo por volver y tratar de entenderlo, lo que no termino de agarrar lo googleo a profundidad y asi puedo avanzar con mayor tranquilidad. Andrés enseña realmente cosas muy útiles (y buenas practicas) que de verdad que casi nadie en internet las enseña. Haz el esfuerzo
Hola, no me queda muy claro el uso de_ guard let_ en la función addTransaction, no entiendo la comparación value = value, es decir, siempre se va a ir por ahí, porque siempre value va a ser igual value.
Gracias
Hola, "guard let" lo que permite es alterar el control de flujo, vigilar que la variable en una funcion o ciclo no sea null en este caso. Ahora cuando se refiere a "value = value", quiere decir que estamos verificando que la variable "value" no sea null (nil en Swift) y sigue con al ejecucion de la funcion y si "value" es null retorne false y termine la ejecucion de la funcion.
Tambien lo puedes hacer con una sentencia if
@discardableResult func addTransaction(transactionValue value: Float?) -> Bool { if let value = value { return false } if (accountTotal - value) < 0 { return false } accountTotal -= value transactions.append(value) return true }
Espero haberte ayudado :)
Creo que así es el reto.
var listaTransacciones: [String:[Float]] = [ "2Nov":[1000, 1000], "3Nov":[1000, 500], "4Nov":[1000] ] var cuentaTotal:Float = listaTransacciones.reduce(0.0, {$0 + $1.value.reduce(0.0, +)}) func transaccion(valorEntrada valor:Float?) ->(transaccionExitosa: Bool, valoractual: Float){ guard let valor = valor else { return (false, cuentaTotal) } if valor == 0{ return (false, cuentaTotal) } listaTransacciones.updateValue([valor], forKey: "5Nov") cuentaTotal = listaTransacciones.reduce(0.0, {$0 + $1.value.reduce(0.0, +)}) return (true, cuentaTotal) } print(cuentaTotal) let cuenta = transaccion(valorEntrada:0) print(cuenta.transaccionExitosa) print(cuenta.valoractual) print(cuenta)
@discardableResult func addTransaction(transactionValue value: Float? = nil) -> (efected: Bool, newTotalAccount: Float) { guard let value = value else { print("No value") return (false, accountTotal) } if(accountTotal - value < 0){ return (false,accountTotal) } transactions.append(value) accountTotal -= value print("Value added") return (true, accountTotal) }
Espero haber entendido el reto :S
Aquí les comparto el código del reto, espero les sirva.
Coloco el reto, modifiqué un poco el código de @Rodgue. en este caso puedes agregar el valor y la fecha. Además puedes agregar más transacciones en la misma fecha:
var totalAccountMount : Float = transactionsDict2.reduce(0.0, {$0 + $1.value.reduce(0.0,+)}) @discardableResult func addTransaction2 (transactionValue value : Float?, date dateValue : String) -> (transactionSuceed : Bool, valueActual : Float) { guard let value = value else { return (false, totalAccountMount) } if (totalAccountMount - value) < 0 { return (false, totalAccountMount) } if transactionsDict2.keys.contains(dateValue) { transactionsDict2[dateValue]?.append(value) totalAccountMount = transactionsDict2.reduce(0.0, {$0 + $1.value.reduce(0.0,+)}) return(true, totalAccountMount) } else { transactionsDict2.updateValue([value], forKey: dateValue) totalAccountMount = transactionsDict2.reduce(0.0, {$0 + $1.value.reduce(0.0,+)}) return(true, totalAccountMount) } } print(transactionsDict2) print(totalAccountMount) let mount = addTransaction2(transactionValue: 10, date: "10nov") print(transactionsDict2) print(mount.transactionSuceed) print(mount.valueActual) let mount2 = addTransaction2(transactionValue: 100, date: "10nov") print(transactionsDict2) print(mount2.transactionSuceed) print(mount2.valueActual)
hola a todos, dejo mi aporte
import Foundation var accountTotal: Float = 1_000_500.30 var accountBalance: Float = 1_000.0 var transactions: [Float] = [10,30,500] @discardableResult func addTransaction(accountValue value: Float?) -> (balanceResult: Float, success: Bool) { guard let value = value else { return(accountBalance,false) } if (accountBalance - value) < 0 { return(accountBalance,false) } else { transactions.append(value) let totalTransactions: Float = transactions.reduce(0.0,+) if (accountBalance - totalTransactions) < 0 { return(accountBalance,false) } else { accountBalance -= totalTransactions } } return(accountBalance, true) } let totalBalance = addTransaction(accountValue: 200) print(totalBalance.balanceResult, totalBalance.success)```
Reto:
var accountTotal: Float = 1_000_000.0 var transactions: [Float] = [20,10.0,100] @discardableResult func addTransaction(transactionValue value:Float?)->(valida:Bool,acTotal:Float){ guard let value = value else { return (false,accountTotal) } if (accountTotal - value) < 0 { return (false,accountTotal) } accountTotal -= value transactions.append(value) return (true,accountTotal) } let respuesta = addTransaction(transactionValue: 1_000_001) print(respuesta.valida) print(respuesta.acTotal)
Dejo mi reto
(success: true, message: "El saldo de la cuenta es 922654.6")
//@discardableResult func addTransaction(transactionValue value:Float? = nil) -> (success:Bool, message:String){ guard value != nil else { return (success:false,message:"No se recibió un valor") } if(accountTotal<0){ return (success:false, message:"La cuanta no puede tener menos de $0") } accountTotal -= value!; return (success:true,message:"El saldo de la cuenta es \(accountTotal)") } print(addTransaction(transactionValue: 325765.35))
//Reto var totalCuenta : Float = 1_000 var transacciones : [Float] = [] @discardableResult func addTransaction(_ value : Float? = nil) -> (transactionState : Bool,totalAccount: Float){ guard let value = value else { return (false,totalCuenta) } if(totalCuenta - value) < 0{ return (false,totalCuenta) } totalCuenta -= value transacciones.append(value) return (true,totalCuenta) } let finalString = addTransaction(100) print("Estado de la transacción: \(finalString.transactionState) \nValor final de la cuenta: \(finalString.totalAccount)")```
//Tupla si fue realizada la transferencia y valor de la cuenta. @discardableResult func addTransactions(transactionsValue value: Float?) -> Bool{ guard let value = value else{ return false } if(accountTotal - value) < 0 { return false } else { accountTotal -= value transactions.append(value) return true } } print(addTransactions(transactionsValue:30 )) let tupla = (succesTransfer: (addTransactions(transactionsValue: 3000)), restOfAccount: accountTotal) print(tupla.succesTransfer ,tupla.restOfAccount)
Reto
@discardableResult func addTransaction( transactionValue value: Float?) -> (isSuccessful: Bool, total: Float) { guard let value = value else { return (false, accountTotal) } if (accountTotal - value) < 0 { return (false, accountTotal) } accountTotal -= value transactions.append(value) return (true, accountTotal) } print(accountTotal) let testTrue = addTransaction(transactionValue: 30) let testFalse = addTransaction(transactionValue: nil) print(testTrue.isSuccessful) print(testTrue.total) print(testFalse.isSuccessful) print(testFalse.total)
func addTransactionReto(transactionValue value: Float) -> (Procesado:Bool, Total:Float) { if (accountTotal - value) < 0 { return (Procesado:false, Total:accountTotal) } accountTotal -= value transactions.append(value) return (Procesado:true, Total:accountTotal) } print(accountTotal) let resultadoReto = addTransactionReto(transactionValue: 50) print(resultadoReto.Procesado,resultadoReto.Total)
Aquí esta la respuesta del reto aplicándolo con un diccionario. También le agregué que la función reciba la fecha en la que se hizo la transacción para que se agregue al diccionario:
var transactionsDict: [String: [Float]] = [ "1 jul": [20,10,100], "2 jul": [], "3 jul": [1000], "4 jul": [], "5 jul": [10] ] @discardableResult func addTransactionDict (_ transaction: Float?, _ date: String) -> (success: Bool, newTotal: Float) { guard let transaction = transaction else { return (false, accountTotal) } if accountTotal - transaction < 0 { return (false, accountTotal) } if ((transactionsDict[date]) != nil) { transactionsDict[date]?.append(transaction) } else { transactionsDict.updateValue( [transaction], forKey: date) } print(transactionsDict) var totalTransactionsDict: Float = 0 transactionsDict.forEach{totalTransactionsDict += $1.reduce(0.0, +)} print(totalTransactionsDict) accountTotal -= totalTransactionsDict return (true, accountTotal) } print(addTransactionDict(75, "3 jul"))
Y lo que devuelve es
transactionsDict: ["1 jul": [20.0, 10.0, 100.0], "3 jul": [1000.0, 75.0], "4 jul": [], "2 jul": [], "5 jul": [10.0]] totalTransactionsDict: 1215.0 addTransactionsDict(75, "3 jul"): (success: true, newTotal: 1098755.0)