Compatibile con Xcode 8

Get e Set linguaggio Swift. Computed Property e modificatori d’accesso

Nella precedente lezioni, ho puntato tantissimo l’attenzione sugli aspetti fondamentali della programmazione ad oggetti in Swift infatti ti dovrebbero essere rimasti impressi le seguenti nozioni:

  • Una Classe è un modello, qualcosa di astratto che delinea le proprietà e funzionalità di un oggetto.
  • Un Oggetto è l’istanza di una Classe.

Io tengo particolarmente alla programmazione ad oggetti perché è quella con cui avrai sempre a che fare durante la creazione di applicazioni. Se vuoi puoi cominciare a dare uno sguardo al corso successivo.

Ecco perché in questa lezione scenderemo leggermente nel dettaglio nella personalizzazione di una classe del linguaggio swift. Ti parlerò dei metodi get e set del linguaggio Swift (chiamate anche computed property) e dei modificatori d’accesso (che riprenderò durante il prossimo corso).

Argomenti che ti permetteranno di capire ancor di più l’importanza della programmazione ad oggetti.

Ma, non perdiamoci in chiacchiere!

I modificatori d’accesso

Spesso e volentieri ti capiterà di voler bloccare, dall’esterno, l’accesso ad una proprietà di una Classe e quindi dell’oggetto.

Ipotizziamo che Paypal ti abbia richiesto di creargli la sua applicazione mobile per la gestione del conto. Contentissimo dell’accaduto e dei soldi percepiti (spero non ti abbiano pagato in visibilità), ti metti a stendere la struttura delle classi del progetto.

Dato che devi gestire il conto bancario, crei una classe conto più o meno così:

Beh, cosa c’è di strano?

La cosa preoccupante e deleteria di questa struttura è che, volendo, in qualsiasi momento si può cambiare il valore del saldo corrente.

Quello che può sembrare uno scherzo, in realtà, ha ripercussioni importantissime sullo sviluppo di un’applicazione pubblica. Nessuno vorrebbe vedere i suoi soldi scomparire nel nulla.

Fortunatamente il linguaggio Swift prevede una un sistema per risolvere questo problema. Si chiamano modificatori d’accesso.I modificatori d’accesso ti permettono di restringere, scusa il gioco di parole, l’accesso ad una proprietà o metodo della classe.

Vediamo come funzionano.

Private

Esiste una parola chiave che ti permette di bloccare l’accesso a tutto ciò che sta all’esterno rispetto alla classe. La keywords è private e va aggiunta prima della definizione della proprietà o metodo della classe.

Prova adesso ad accedere, da un oggetto, a questa proprietà:

private-linguaggio-swift

Quindi come faccio a leggere il mio saldo?

A questo punto potresti creare un metodo stampaSaldo() che ti permetta di stampare il valore del saldo corrente.

Esiste un sistema più elegante per risolvere questo problema e lo vedrai tra pochissimo.

Gli altri modificatori d’accesso (internal, fileprivate e public) è inutile che te li faccio vedere qui perché non potrei farti vedere la loro applicazione. Serve un progetto con più file per poter investigare gli altri acess modifier. Nel prossimo corso ne faremo largo uso.

condividi xcoding

Ho impiegato un po’ di tempo a scrivere questo tutorial. Se ti va, ricambia il mio lavoro, con un like alle mie pagine!

[addtoany]

Grazie ;)

Proprietà Computed

Ti avevo detto che esiste un modo più elegante per poter risolvere il problema del: come faccio a leggere il valore di una proprietà private dall’esterno del progetto?

La risposta a questa domanda sta nelle Computed Property. Le proprietà computed o calcolate sono delle speciali proprietà che possono svolgere dei calcoli quando vi si accede o si prova a modificarne il loro valore. In pratica si comportano come delle piccole funzioni.

Get

La prima proprietà computed da investigare è la get. Una proprietà get ti permette di accedere solamente al suo valore o al valore di altre proprietà ma non ti permette di assegnargli un nuovo valore. 

Per creare una proprietà get si fa seguire al Tipo di Dato della proprietà, che deve essere obbligatoriamente espresso, le parentesi graffe. Al suo interno si scrive la parola chiave get seguita da altrettante parentesi graffe.

Get significa prendere o restituire. Quindi la proprietà di tipo get restituisce, quando gli si proverà ad accedere un valore del tipo di dato espresso dalla proprietà. All’interno delle sue parentesi graffe deve essere presente un return dello stesso tipo di dato della proprietà.

Visto così sembra difficile da spiegare.

Riprendiamo l’esempio del ContoPaypal e creiamo una proprietà di tipo get che ci restituisce il valore della proprietà private conto. Chiamiamola var saldoCorrente: Double:

La proprietà get-only saldoCorrente, così vengono chiamate, quando verrà letta restituirà il valore contenuto all’interno della var private conto. Dato che è get ti è anche assicuro che nessuno potrà modificare il suo valore.

roprieta-get-only-linguaggio-swift

Puoi ovviamente anche eseguire delle altre operazioni all’interno della proprietà get. Per esempio se volessi fare un print o richiamare delle altre funzioni, o ancora eseguire dei calcoli, potrai farlo. L’importante è che venga restituito un valore dello stesso tipo della proprietà (in questo caso dovevamo tornare un Double).

Set

Se il get restituisce il set modifica. Cosa modifica, ovviamente un’altra proprietà della classe passando il valore a questa nuova proprietà set.

Ti dico subito che una proprietà set può essere aggiunta ad una proprietà che è già get. In questo caso si parla di proprietà get-set only.

La differenza di sintassi sta nel fatto che devi immaginarla come ad una funzione con un unico parametro che ha come tipo di dato quello della proprietà.

All’interno delle parentesi tonde del set va scritto un nome qualsiasi (io metto nuovoValore o newValue) questa variabile prenderà il valore che scriverà l’utente quando assegnerà un valore alla proprietà.

Facciamo un esempio così ci capiamo al volo.

Alla proprietà saldoCorrente ho aggiunto il set. Al suo interno ho assegna il nuovoValore che passerà l’utente alla proprietà private saldo.

Così non ritorniamo allo stato di partenza in cui stiamo modificando il saldo del conto bancario?

In effetti è vero. La differenza è che adesso possiamo intervenire sul set di questo valore mettendo dei controlli nella fase di inserimento.

In questo caso quando l’utente proverà ad inserire un saldo negativo il set uscirà dal metodo bloccandone la modifica.

Esercizio 0. Crea una nuova proprietà, solo set, che ti permetta di incrementare e decrementare il saldo attuale. Quando l’utente inserisce un valore negativo diminuisce il valore del saldo altrimenti lo aumenta. Metti un controllo che prevenga la possibilità di mandare il saldo in negativo.

Versione contratta del get

Se la proprietà è solo get, cioè è read-only, puoi scriverla direttamente in questa forma:

Esempio. Data una classe Persona con le proprietà nome, cognome ed età, crea una proprietà solo get chiamata codiceFiscale che restituisca l’unione di questi valori:

Alcune regole

  1. Non puoi modificare la stessa proprietà che implementa il get-set. Puoi solamente interagire con le altre della classe
  2. Quando puoi, invece delle funzioni, preferisci sempre le proprietà get-set (o computed property) per interagire con le proprietà della classe
  3. Una proprietà get può esistere senza un set

Considerazioni

Diciamo che questa è stata una lezione alquanto soft. Mi interessava introdurre questi primi strumenti per farti cominciare ad intravedere le potenzialità della programmazione ad oggetti con il linguaggio Swift.

Anche perché, come ti dicevo, questi sono strumenti che si utilizzeranno con maggior importanza durante lo sviluppo delle applicazioni iOS.

Nella prossima lezione ti assicuro che si ballerà. Ti introdurrò quello che sarà l’elemento più importante di tutto il modulo: L’ereditarietà delle classi.

Esercizi

Se ti fa piacere di condividerli, o nel caso avessi avuto dei problemi, lascia pure un commento.

  • Esercizio 1. Un albergo ti richiede di creargli un’applicazione per la gestione delle sue camere. Per semplicità d’esercizio:
    • Una Camera è composta dagli attributi: codice e prenotata. codice è una semplice Stringa e prenotata è un Bool di default a false.
    • L’albergo contiene il riferimento ad ogni stanza (in un array).
  • Un utente deve essere in gradi di prenotare una camera libera utilizzando una funzione. Se non ci sono più camere libere deve dare un messaggio d’errore.

Aiuto. Come posso usare le proprietà get e set in questo esercizio?

  • Potresti usare una proprietà solo get per recuperare facilmente il numero di camere libere nell’albergo. Suggerimento: La proprietà la puoi chiamare var numeroStanzeLibere: Int al suoi interno un get fa un ciclo nell’array di stanze dell’Albergo e conta il numero di stanze libere. Quando ha finito restituisce il conteggio.

Buona Programmazione!

Changelog

  • 25/10/2016 – Aggiunto il changelog. Modifiche sostanziali al testo e compatibilità con Xcode 8 e linguaggio swift 3.0.

Torna a: Corso gratuito linguaggio di programmazione Swift > Programmazione ad oggetti in Swift

Start typing and press Enter to search

Closure in Swift