No tienes acceso a esta clase

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

Aserciones y Precondiciones

21/22
Recursos

Aportes 12

Preguntas 1

Ordenar por:

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

o inicia sesi贸n.

La funci贸n assert() te permite verificar el estado de tu programa en tiempo de ejecuci贸n y fallar si las cosas no son como deber铆an ser. Una de las caracter铆sticas interesantes de assert() es que se elimina autom谩ticamente cuando construyes tu aplicaci贸n en modo de lanzamiento, pero si no queres que eso suceda, si queres que tu aplicaci贸n se bloquee si algo est谩 muy mal, entonces deber铆as usar la funci贸n precondition() en su lugar.

let age = -5
assert(age >= 0, "La edad de una persona no puede ser negativa."

precondition() funciona de manera id茅ntica a assert(): dale una condici贸n para verificar junto con un mensaje opcional para imprimir si la verificaci贸n falla. En tiempo de ejecuci贸n, incluso en el modo de liberaci贸n, Swift ejecutar谩 la verificaci贸n por vos y se bloquear谩 si falla.

precondition(age >= 0, "La edad de una persona no puede ser negativa.")

En ambos casos devuelve este error:

error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
The process has been left at the point where it was interrupted, use 鈥渢hread return -x鈥 to return to the state before expression evaluation.

El concepto del debug siempre ha ayudado a poder localizar los posibles errores que existan en nuestro codigo que por malas practicas quizas no sean tan visibles para el programados, para eso es bueno conocer el buen manejo de los assert y los preconditions

import UIKit

var hungry: Bool = true
var thereIsGas: Bool = true
var thereIsingredients: Bool = true


func makeSandwich() throws{
    if hungry {
        if thereIsGas {
            if thereIsingredients {
                
                print("Hora de comer")
            }else{
                throw SandwichError.noyIngredients
            }
        }else{
            throw SandwichError.notGas
        }
    } else{
        throw SandwichError.notHungry
    }
}


do{
    try makeSandwich()
    }catch SandwichError.notHungry{
        notHungry()
    }
    catch SandwichError.notGas{
        notGas()
    }
    catch SandwichError.noyIngredients{
        noyIngredients()
    }catch let error {
        print(error.localizedDescription)
    }


func notHungry(){
    print("Mas tarde, no tengo hambre")
}
func notGas(){
    print("Se termino el gas")
}
func noyIngredients(){
    print("No tengo todos los ingredientes")
}
func verifySteps(){
    print("Verificar si estan todos los ingredientes")
}


enum SandwichError: Error {
    case notHungry
    case notGas
    case noyIngredients
}

las precondiciones me sonaron a: no compiles el c贸digo a menos que se cumpla esto , si no se cumple lanzame tal error para saber donde fall贸.

Realic茅 este ejemplo sencillo sobre un control de tareas y tiempo en pantalla.

<code> 
var finishedHomework:UInt8 = 5
let assignedHomework:UInt8 = 8

precondition(finishedHomework == assignedHomework, "Debe realizar todas las tareas para jugar en el movil")
precondition(finishedHomework >= 0, "Las tareas terminadas no pueden ser negativas")

if finishedHomework == assignedHomework {
    print("Puede jugar en el movil")
} else if assignedHomework > finishedHomework && finishedHomework >= 0{
    preconditionFailure("Debe terminar todas las tareas para jugar en el movil")
} else {
    preconditionFailure("Las tareas terminadas no pueden ser negativas")
}

Se me ocurri贸 de ejemplo el rango de peso pluma para una pelea en la UFC 馃槃

import UIKit

//UFC Feather weight limits (136鈥145 lb)

let featherWeightLimits = (136, 145)
let (minWeight, maxWeight) = featherWeightLimits
let unitsWeight : String = "lb"

var fighterWeight: Int16
fighterWeight = 140

//assert(fighterWeight <= featherWeightLimits.1, "Fighter is overweighted and disqualified")
//precondition(fighterWeight <= featherWeightLimits.1, "Fighter is overweighted and disqualified")

if fighterWeight >= featherWeightLimits.0 && fighterWeight <= featherWeightLimits.1 {
    print("Fighter is in range to keep the fighting")
} else if fighterWeight < featherWeightLimits.0 {
    print("Fighter has a limit of two hours to bulk up or the fight is gonna call off")
} else {
    assertionFailure("Fighter is overweighted and disqualified")
}

faltan por explicar muchas cosas de lo basico y ya estan pasando a nivel medio

esto es TDD?

let gasLevel = -0.2

assert(gasLevel >= 0, "el nivel de gasonila no puede ser negativo")

if gasLevel == 1.0 {
    print("el tanque esta lleno")
} else if gasLevel >= 0.5 {
    print("el tanque esta a mas de la mitad")
} else if gasLevel < 0.5 {
    if gasLevel <= 0 {
        assertionFailure("el nivel de gasonila no puede ser negativo")
    } else {
        print("el nivel de la gasonila esta a menos de la mitad")
    }
}

// Reto

let batteryPercentage = -10

if batteryPercentage < 20,
    batteryPercentage > 0{
    print("bateria baja")
}else if batteryPercentage > 20,
    batteryPercentage <= 100 {
    print("bateria ok")
}else{
    assertionFailure( "La carga de la bateria no puede ser mayor a 100% o menor a 0%")
}


let areaTractorCrop = 50_000
let areaLandCrop = 10_000

if areaTractorCrop <= areaLandCrop
{
    print("El tractor puede cosechar sin problemas")
}
else if areaTractorCrop <= areaLandCrop / 2
{
    print("El tractor puede cosechar sin problemas, pero requiere de m谩s tiempo")
}
else
{
    assertionFailure("Las dimensiones del tractor son demasiadas para el 谩rea requerida")
}

los asserts son globales? Me refiero a que si la declaro despu茅s de la creaci贸n de la variable age pero esta es declarada al inicio de mi c贸digo al igual que el asserts pero la inserci贸n de la edad del usuario es de los 煤ltimos datos el assert seguir铆a funcionando? o es como una condicional que se tiene que poner despu茅s del cambio de valor de la variable?