Skip to main content

Failable Initializers in Swift

Sin dalla prima beta rilasciata nel WWDC del Giugno 2014, Swift ha posto un accento particolare sul concetto di Optional.

Una funzionalità strettamente legata al concetto di Optional è quella del Failable Initializer (introdotto con Swift 1.1).

NON Failable Initializer

Un initializer (non failable) ha il compito di costruttore un valore del tipo a cui appartiene.

Ad esempio la struct String ha un initializer che riceve un Int e si occupa di costruire una String.

Questi initializers sono NON failable, infatti è sempre possibile costruire una stringa a partire da un Int.

Failable Initializer

Viceversa, la struct Int fornisce un initializer che riceve una String e cerca di costruire un Int.

Possiamo facilmente immagine che questo initializer non potrà sempre portare a termine il suo lavoro. Infatti potrebbe ricevere come parametro una stringa del tipo “I’m an amazing programmer 😎”, in tal caso non sarebbe in grado di creare un Int.

Per questo motivo questo initializer è dichiarato failable e ha la facoltà di ritornare nil nel caso in cui, appunto, dovesse fallire.

Uwrapping

Proprio perché l’initializer di Int che accetta una stringa è dichiarato failable, questo significa che il tipo che restituisce non è un Int ma un Int?.  Ovvero un qualcosa che può contenere nil oppure un Int.

Quindi se volessimo indicare esplicitamente il tipo della variabile zero vista in precedente dovremmo scrivere

E se la stampassimo

Otterremmo quanto segue

Se vogliamo stampare l’Int contenuto in zero possiamo effettuare un unwrapping, uno metodo sicuro per farlo è il seguente

Nella console di Xcode apparirà ora

Creare un Failable Initializer

La sintassi di un falible initializer è simile a quella classica, ci sono solo 2 differenze:

  • dovete aggiungere un ? dopo la parola init
  • potete effettuare un return nil

Un failable initializer è utile, ad esempio quando dovete costruire un valore ma a livello di compilazione non avete la garanzia di aver ricevuto tutti i parametri corretti per farlo.

Immaginate di avere una struct Person e di dover scrivere un failable initializer che riceve un JSON e tenta di inizializzare un valore di tipo Person. Ecco come fare

Le righe #8, #9 e #10 si occupano di estrarre il nome, il cognome e l’età della persona dal JSON. Nel caso uno di questi valori risulta mancante allora viene eseguito il return nil alla riga #11.

Altrimenti si procede a inizializzare correttamente tutte le property di Person alle righe #12, #13 e #14.

Conclusione

Dubbi o commenti? Usate i commenti qui sotto e risponderò il prima possibile.

Se invece avete trovato utile l’articolo potete condividerlo con i pulsanti social che trovate si seguito.

Trainer • Developer • Writer

Luca Angeletti

Trainer • Developer • Writer

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *