Creare eccezioni custom in Swift

Mattepuffo's logo
Creare eccezioni custom in Swift

Creare eccezioni custom in Swift

In un precedente articolo abbiamo visto come usare le eccezioni in Swift.

In questo vediamo come creare delle eccezioni custom.

In generale non è una cosa comune farlo, ma può essere utile sapere come si fa.

Partiamo semplicemente da questo esempio:

import Foundation

class Persona {
    var nome: String;
    var cognome: String;
    
    init(nome: String, cognome: String) throws {
        self.nome = nome
        self.cognome = cognome
    }
}

var p = Persona(nome: "", cognome: "")
print("(p.nome) \(p.cognome)")

Questo stamperà delle stringhe vuote.

Potremmo mettere un controllo con delle if in tutti i luoghi dove instanziamo Persona, oppure potremmo creare una eccezione per le stringhe vuote.

Ad esempio:

import Foundation

enum PersonaError: Error {
    case nomeVuoto
    case cognomeVuoto
    // TUTTI GLI ALTRI ERRORI
    case unexpected(code: Int)
}

extension PersonaError: LocalizedError {
    public var errorDescription: String? {
        switch self {
        case .nomeVuoto:
            return NSLocalizedString(
                "Non è stato inserito un nome",
                comment: "Si prega di inserire un valore"
            )
        case .cognomeVuoto:
            return NSLocalizedString(
                "Non è stato inserito un cognome",
                comment: "Si prega di inserire un valore"
            )
        case .unexpected(_):
            return NSLocalizedString(
                "Errore generico",
                comment: "Unexpected Error"
            )
        }
    }
}

class Persona {
    var nome: String;
    var cognome: String;
    
    init(nome: String, cognome: String) throws {
        if nome.trimmingCharacters(in: .whitespacesAndNewlines) == "" {
            throw PersonaError.nomeVuoto
        }
        
        if cognome.trimmingCharacters(in: .whitespacesAndNewlines) == "" {
            throw PersonaError.cognomeVuoto
        }
        
        self.nome = nome
        self.cognome = cognome
    }
}

do {
    var p = try Persona(nome: "m", cognome: "f")
    print("\(p.nome) \(p.cognome)")
} catch PersonaError.nomeVuoto {
    print(PersonaError.nomeVuoto.localizedDescription)
} catch PersonaError.cognomeVuoto {
    print(PersonaError.cognomeVuoto.localizedDescription)
} catch let err {
    print(err.localizedDescription)
}

Ovviamente questo è un codice di esempio da cui partire.

Anche se nella magior parte dei casi non ci servirà crearle, fate qualche prova!

Enjoy!


Condividi

Commentami!