Skip to main content

Come evitare La Piramide Della Sventura con Swift 1.2

Uno dei concetti alla base di Swift è quello degli Optional, cioè la possibilità di poter determinare (già durante la compilazione) se una certa variabile potrà in seguito assumere un valore nullo.

In un linguaggio di programmazione che non supporta gli Optional (come Objective-C) accade che una variabile di tipo primitivo (int, BOOL, double, …) sarà sempre popolata (verrà inizializzata da ARC con 0 se non lo farà lo sviluppatore).

D’altro canto in Objective-C una variabile che referenzia un oggetto potrà sempre assumere valori di tipo nil.

In Swift quando dichiariamo una variabile possiamo indicare se potrà assumere valori nulli (indipendentemente dal fatto che la variabile contenga un tipo primitivo, una struttura, un enum o referenzi un’oggetto).

La prima riga qui di seguito dichiara una variabile di tipo String e potenzialmente nulla.

Mentre la seguente istruzione forza la variabile walterWhiteAlias a referenziare sempre una String.

Optional Binding in Swift 1.0

Bisogna tenere a mente che String e String? sono 2 tipi di dato differenti. Ad esempio un metodo che riceve come parametro una variabile i tipo String, non accetterà un parametro di tipo String?

Nel blocco di codice seguente, ad esempio, non possiamo passare walterWhiteAlias (String?) a un metodo che invece richiede un parametro di tipo String.

breaking-bad-say-my-name1

Abbiamo visto in un articolo precedente che è possibile trasformare una variabile Optional in una non Optional usando l’operatore !

In questo caso ci stiamo assumendo la responsabilità che walterWhiteAlias sia sicuramente popolata, se durante l’esecuzione assumerà valore nil e verrà eseguita l’istruzione precedente l’applicazione terminerà.

Il seguente codice è più sicuro.

Il blocco di codice precedente può essere scritto in modo più elegante usando il costrutto Optional Binding.

Vediamo come funziona. La prima riga valuta il contenuto di walterWhiteAlias (che deve essere una variabile Optional), se diverso da nil allora viene assegnato alla costante theAlias e viene eseguito il blocco tra parentesi graffe. E’ importante notare che mentre walterWhiteAlias è di tipo String?, theAlias è di tipo String e quindi può (deve) essere usato senza il comando “!”.

Per semplicità generalmente uso lo stesso nome per la costante.
Bisogna solo fare attenzione a ricordare che all’interno della parentesi graffe walterWhiteAlias refenzia la costante di tipo String e non la variabile di tipo String?

Analogamente è possibile estrarre il contenuto dell’Optional in una variabile.

La piramide della sventura

Il termine inglese (preso in prestito dal mondo JavaScript) è Pyramid of doom. Di cosa si tratta? Ecco qualche indizio per capirlo.

Immaginiamo di avere questo metodo che prende come parametri 5 Int (non Optional).

Poi abbiamo queste 5 variabili di tipo Int? (quindi Optional).

Le variabili vengono poi popolate e infine vogliamo invocare hideMoney usando l’Optional Binding. Ecco la Piramide della Sventura.

Optional Binding in Swift 1.2

Questa settimana Apple ha ufficialmente fatto uscire Swift 1.2 dalla fase di beta. La nuova versione del linguaggio contiene interessanti novità tra cui la possibilità di effettuare Optional Binding multipli all’interno dello stesso costrutto IF.

Semanticamente questo blocco di codice è identico a quello precedente, solo più essenziale.

Infatti:

  1. le assegnazioni vengono fatte in ordine, se fromTuco è diversa da nil allora viene estratto il valore, assegnato alla costante fromTuco (ricordate che potete usare nomi differenti per le costanti che dichiarate) e poi si passa a valutare la condizione successiva (fromGus);
  2. se fromTuco è nil allora la valutazione delle variabili termina e il blocco tra parentesi graffe non viene eseguito
  3. il blocco tra parentesi graffe viene eseguito solo se tutte e 5 le variabili optional sono diverse da nil

if let… where

Il costrutto IF precedente è essenziale ma piuttosto differente da quelli degli altri linguaggi. Infatti potremmo voler inserire delle condizioni più complesse. Ad esempio possiamo richiedere che la somma dei 5 interi sia maggiore di 0. In tal caso possiamo usare la keyword where.

La condizione where viene eseguita solo se i 5 optional precedenti sono stati estratti correttamente (e quindi erano non nulli). Inoltre nella clausola where le nuove costanti (non optional) sono già attive.

Conclusione

Swift 1.2 introduce altre novità (che vedremo in seguito) e si conferma un linguaggio vivo che si evolve e migliora mese dopo mese. Swift 1.2 è disponibile con Xcode 6.3 disponibile su Mac App Store.

Trainer • Developer • Writer

Luca Angeletti

Trainer • Developer • Writer

Lascia un commento

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