Compatibile con Xcode 8

Opzionalità in Swift. Essere o non essere, questo è il dilemma

Essere o non essere. Il dubbio amletico ha causato non so quanti problemi ai linguaggi di programmazione come Swift.

Il problema, che nella tragedia si riconduce al vivere o morire, nel linguaggio di programmazione Swift assume una connotazione un po’ diversa ma dal risultato decisamente simile.

La faccio breve!

Sai definire il niente o il nulla? 

No. Se stai pensando al numero zero stai completamente andando fuori strada. Il numero 0 infatti è un numero che ha la funzione di rappresentare il non valore.

Cioè se hai una torta composta da 4 fette, dire che la torta ha zero fette vuol dire che è finita ma non che non esiste.

Qui la questione è un po’ più ampia e riguarda la possibilità di poter descrivere la non presenza di sostanza tramite il linguaggio Swift. Nell’esempio della torta, questo concetto, potrebbe essere inteso come la non presenza né della torna né tantomeno del piatto. Entriamo subito nel vivo della questione, analizzandolo con il linguaggio Swift.

Ti ricordi come nella lezione delle variabile e costanti ti ho fatto notare la differenza tra dichiarare e inizializzare?

  • Dichiarare significa creare una variabile senza assegnargli nessun valore:
  • Inizializzare significa assegnare un valore alla sua creazione:

Sei mai riuscito a sommare quattro patate con il nulla?

La variabile_dichiarata in questo momento si trova nello stato di “non presenza di valore” e non contenendo valore il linguaggio Swift non è in grado di poter eseguire delle operazioni. 

Ecco il motivo per cui il Playground mostra l’errore: “variabile_dichiarata non inizializzata“:

opzionalita-linguaggio-swift

Peppe, non potevo evitare ogni problema inizializzando la variabile?

Più o meno. Fino ad ora inizializzare una variabile in Swift non costa nulla né in termini di tempo né in termini di risorse. Risorse?

Eh si! Perché inizializzare una variabile con il Playground, e in futuro con la tua applicazione, consumerà un po’ di memoria, cpu e ovviamente tempo. 

Poi, c’è un altro motivo, perché dovrei inizializzare una variabile prima del suo reale utilizzo? Cioè se una variabile la utilizzerai dopo 2876 righe di codice, perché farla nascere prima del tempo?

Queste domande sono venute anche ai cervelloni della Apple. Motivo che li ha portati ad inventare un sistema chiamato Opzionalità del linguaggio Swift (In realtà è solamente una rivisitazione molto semplificata di sistemi adottati in altri linguaggi). 

Cosa fa questa Opzionalità in Swift?

In poche parole, l’opzionalità del linguaggio Swift, ti permette di definire un valore al concetto di non valore. 

Pronto? Allora vediamo insieme cos’è l’opzionalità in Swift e come utilizzarla.

I marcatori “?” e “!”. Definire e gestire l’opzionalità in Swift

Immagina d’avere appena aperto un nuovo conto in banca. La commessa, prima di andartene, ti domanderà: “Vuole mettere dei soldi sul suo conto o lo lasciamo a zero?”

In questo momento il tuo conto si trova nell’essere in bilico tra l’avere dei soldi o non averne:

  • Forse avrò dei soldi.
  • Forse non ne avrò.

Cioè, se la tua applicazione serve a gestire un salvadanaio, nel tuo codice Swift equivarrebbe a definire e dichiarare una nuova variabile chiamata contoInBanca:

Non potevo mettere zero come valore di default?

Verissimo pure. Ma, se ci pensi, anche lo zero è un valore.

La questione, dunque, ha un’importanza ancora più ampia e profonda di quella che ho provato a descriverti con questo semplicissimo esempio. Man mano che ti addentrerai nel corso sul linguaggio Swift e nel corso di sviluppo applicazioni iOS ti renderai conto dell’importanza di questo strumento.

L’opzionalità in Swift hai capito che risolve il problema, vediamo come!

Question Mark: come rendere opzionale una variabile con il marcatore “?”

Dire che una variabile è opzionale significa che ha un valore universale che simboleggia l’assenza di valore.

La parola chiave o keyword dell’assenza di valore è: nil (tradotto: il nulla). Dunque, dirai che la variabile è opzionale, o ha valore nil, quando essa ha come valore nil.

Voglio sottolineare che, una variabile opzionale, non assume valore 0. Per il linguaggio Swiftnil e zero (e Void dei linguaggi C based) sono concetti totalmente differenti.

Come faccio a rendere una variabile opzionale?

Puoi attivare l’opzionalità in Swift aggiungendo il simbolo punto interrogativo (?) davanti al tipo di dato di una variabile. Il Question Mark, o punto interrogativo, rende opzionale una variabile:

Opzionalità in Swift. Il question mark

Rendendo opzionale la variabile, quest’ultima assume il valore simbolico di nilNel tuo playground apparirà il valore nil come valore di default della variabile contoInBanca.

A questo punto dovrebbe essere chiare 2 cose:

  1. La semplice dichiarazione di una variabile non rende opzionale la variabile.
  2. Per rendere opzionale una variabile bisogna utilizzare solamente il question mark.

Adesso prova ad assegnare un valore alla variabile opzionale ed a stampare il suo contenuto:

Quando provi a stampare il contenuto di una variabile opzionale accade qualcosa di inusuale.

Ovvero viene stampato il contenuto della variabile dentro la dicitura Optional(valoreVariabile). Questo succede perché una variabile opzionale si presenta con una duplice forma:

  1. Da un lato non possiede valore, quindi il suo contenuto è nil.
  2. Dall’altro può contenere qualsiasi valore (del tipo specificato). Nell’esempio sopra la variabile è opzionale ma possiede il valore 4.

Il linguaggio Swift non è in grado di capire quale delle due forme stai utilizzando. Per questo motivo, previene il problema, dicendoti che all’interno della variabile c’è un valore opzionale.

Il Playground, con la dicitura Optional(valoreVariabile), preferisce dirti: “Ehi, il valore c’è però potrebbe non esserci“.

L’opzionalità in Swift fa da involucro al valore contenuto della variabile.

Opzionalità in swift. Valore ad una var opzionale

Unwrap di un optional value: accedere al contenuto di un variabile opzionale con il marcatore “!”

La variabile opzionale non gode delle proprietà che hanno le variabili normali. Operazioni come la somma, divisione, ecc. non possono essere eseguite se lasciate in questa forma:

Il linguaggio Swift non è in grado di capire se vuoi accedere al contenuto della variabile oppure se vuoi continuare a considerarla come opzionale.

Devi farglielo capire. Per farlo necessario esplicitare che vuoi accedere al valore reale contenuto dalla variabile opzionale.

Lo strumento per trattare la variabile opzionale come una normale var si chiama Unwrap. Consiste nell’estrapolare il valore, qualora presente, della variabile opzionale ed a trattarlo come un valore non opzionale.

Il marcatore in è il “!“. Va inserito dopo il nome di una variabile quando vuoi toglierle momentaneamente l’opzionalità:

Il compilatore, prende la variabile opzionale, legge il valore, capisce che è un optional e con il marcatore “!” entra ancora più in profondità assicurandosi che realmente quel valore esista.

L’unwrap prende la faccia della medaglia che gestisce il valore reale e lascia perdere la faccia opzionale.

Perché è importante?

L’unwrap di un valore opzionale serve per non mandare in confusione il compilatore, guarda questo esempio:

La somma di due variabili opzionali genera errore perché il compilatore non sa quello che deve fare: “Non so se prendere il valore nil oppure sommare i valori contenuti nelle var“.

Quindi con l’unwrap forzi il compilatore ad usare i valori reali delle due variabili:

Opzionalità in Swift. Question e Unwrap Mark

Esercizio svolto e commentato

Proviamo a sfruttare l’optional value e l’unwrap per realizzare una sorta di gestore del login per guest e utenti:

  • Alla riga n.1 dato che il nome di un utente potrebbe non essere specificato e quindi potrebbe essere nil, dichiaro la variabile OptionalName come opzionale e gli assegno un valore che verrà trattato sempre nella duplice maniera.
  • Con l’if-else controllo che la variabile optional sia uguale a nil, se è così vuol dire che non è stato impostato un nome per la variabile e che quindi sta entrando un guest.
  • Se optionalName non è nil allora vuol dire che ha un valore ed eseguo l’unwrap dato che sono più che sicuro che non è nil.

condividi xcoding

Sarei davvero felice se contribuissi al mio progetto semplicemente mettendo un mi piace o follow alle mie pagine.

[addtoany]

Grazie davvero :-)

Opzionalità in Swift: 3 Consigli e curiosità utili per non cadere nel dubbio amletico

Da quando ho aperto xcoding.it ho stilato una classifica delle cose più difficili da capire per un nuovo sviluppatore. Tra le prime posizioni c’è sicuramente l’opzionalità in Swift (se la gioca con le closure in Swift. Una cosa per volta!).

Per evitare di farti impazzire e per fissare meglio le idee, ho pensato di stilare questi tre consigli.

1# Nel dubbio l’opzionalità non guasta mai

A fine corso scrivere le variabili opzionali diventerà prassi, inizia a farlo da adesso.

Previeni un’infinità di problemi e rendi il codice più fluido da leggere. In più eviti di dover inserire dei valori di default.

2# I valori di un dizionario sono di default optional

In un dizionario, il “valore” associato alla “chiave” è un’informazione che, di default, è opzionale. Ovvero se è vuoto o no non fa differenza.

Ora hai capito perché nell’esempio della lezione Array e Dizionari in Swift spuntava Optional(valore). Ora sai che può essere risolto con l’unwrap:

[su_spoiler title=”Esempio divina commedia” style=”fancy”]

[/su_spoiler]

3# Optional Binding: prevenire gli errori dell’opzionalità

Anche con l’opzionalità in Swift comunque ci sono dei problemi. Uno tra questi è quello di tentare ad Unwrappare una variabile opzionale che non ha assegnato nessun valore.

Qual è lo strumento che conosci per poter controllare il codice?

Esatto! L’if-else potrebbe risolvere questo spiacevole inconveniente.

Dato che di default il valore di una variabile opzionale è nil, potresti controllare la sua presenza o meno e quindi unwrappare il valore solo nel primo caso (ho usato questo stratagemma nell’esercizio sul login da guest):

Esiste un altro sistema!

Puoi compattare, all’interno dell’if, l’unwrap di un valore opzionale.

All’interno dell’if si assegna il contenuto della variabile opzionale ad una variabile/costante creata e dichiarata all’interno della condizione dell’if. Se la variabile opzionale ha un valore, allora la varlo prende e lo conserva, altrimenti scatta l’else.

Forse faccio prima a fartelo vedere:

La costante unwrap_peso nasce all’interno della condizione dell’if e può essere utilizzata solo all’interno del blocco dell’if. Nasce e muore esclusivamente per leggere il valore della variabile opzionale.

Nota come non viene eseguito un confronto, cioè non viene utilizzato il simbolo (==), bensì un passaggio di valore.

Quest’operazione può essere letta nella seguente maniera: “se la variabile non è nil allora assegna il contenuto alla costante, altrimenti passa all’else“.

Puoi utilizzare entrambe le sintassi senza nessuna distinzione.

Tra le due possibilità di unwrap è comunque preferibile utilizzare l’optional binding (il secondo sistema, quello con if let nomeCostanteTemporanea = varOpzionale).

Conclusione

Come per l’istruzione if else, anche l’opzionalità in Swift è qualcosa che ti porterai dietro fino e durante lo sviluppo di applicazioni per iOS, OS X e watchOS.

Forse farei prima a dire che tutti gli argomenti del corso sono fondamentali?

Tiriamo le fila

  • L’opzionalità serve per dare consistenza e forma alla non presenza di valore.
  • L’opzionalità di una variabile con il linguaggio Swift è data dall’utilizzo del marcatore “?” dopo il tipo di dato.
  • Nil è il valore che assume una variabile opzionale.
  • Evita di inizializzare le variabili e preferisci l’opzionalità in Swift.
  • Per leggere l’effettivo valore di una variabile opzionale devi utilizzare l’unwrap “!”.
  • Anche l’optional value in Swift ha degli errori che possono essere risolti con optional binding.

Buona Programmazione!

Changelog

  • 09/10/2016 – Aggiunto il changelog. Modifiche al testo e check compatibilità con Xcode 8 e Swift 3.0.

Torna a: Corso gratuito linguaggio di programmazione Swift > Le basi del linguaggio Swift

Start typing and press Enter to search

if else in SwiftIstruzione guard in Swift