Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Aserciones y Precondiciones

21/22
Recursos

Aportes 10

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta 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 “thread return -x” to return to the state before expression evaluation.

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
}

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

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

esto es TDD?

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ó.

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?