Compatibile con Xcode 7

Le strutture con il linguaggio Swift. Crea solide fondamenta!

Da cos’è formata una casa? Sicuramente da tanti componenti senza i quali la casa non si potrebbe chiamare tale. Infatti la casa è composta da mattoni, pilastri, pavimento, impianti elettrici, ecc. Quando parli di casa, quindi, stai involontariamente riferendoti anche a tutti i pezzi che la compongono.

Ma come potresti rappresentare una casa con il linguaggio Swift?

Potremmo utilizzare tante variabili diverse dove ognuna di esse rappresenta un pezzo della casa. Così facendo però si rischia di mischiare tutte queste variabili con il resto del codice e, in più, ogni qual volta vuoi descrivere la casa dovresti prendere ad una ad una ogni variabile.

Ad esempio:

Anche facendo così, concettualmente quelle variabili non sono collegate tra loro, o meglio, lo sono per noi che abbiamo scritto il codice ma non lo sono per il linguaggio Swift o tantomeno per una futura applicazione.

Servirebbe qualcosa che li racchiudesse tutte sotto il nome comune di casa.

Qualcosa del genere l’hai già vista fare con il tipo Enum in Swift. L’enumerazione però, in questo caso, non potrebbe fare al caso tuo. Infatti l’enumerazione serve a contare e mettere insieme pezzi simili: numeri con numeri, pianeti con pianeti e cosa più importante non ti permette di svolgere operazioni.

Qui la questione è più ampia perché stiamo cercando un sistema più complesso che mette insieme pezzi diversi che descrivono, però, un oggetto comune.

A tal proposito il linguaggio Swift ti offre uno strumento, chiamato Structure (o struttura), che permette di raggruppare variabili, costanti e funzioni. Una struct è un insieme di variabili, costanti e funzioni anche di tipo diverso, raggruppate tutte da un singolo nome.

Sempre come piace a me, procediamo per esempi.

Ti ricordi, più o meno, cosa sia un punto geometrico? Sapresti rappresentarlo con il linguaggio Swift?

Per essere definito, un punto, ha bisogno di solo due variabili, la x e la y. Se ci pensi anche in questo caso, quando parli di punto ti stai riferendo a qualcosa che ha a che fare con quelle due variabili. La x senza la y non avrebbe senso di esistere. Sto considerando un piano geometrico cartesiano, quindi definito dagli assi x (ascissa) e y (ordinata). Un punto può anche essere definito in un piano a tre coordinate.

Con le nozioni apprese fin ora avresti risolto il problema in questi due modi:

Questo sistema è poco funzionale e ottimizzato! Perché? Prova adesso a creare un triangolo. Triangolo?

Ti rendi subito conto che più il livello di astrazione aumenta più diventa difficile rappresentare qualcosa mediante i metodi di programmazione procedurale appresi nella prima parte del corso di programmazione Swift.

Adesso ti mostrerò un sistema, le structure con il linguaggio Swift, che ti permetteranno di unire tutte quelle variabili per creare qualcosa che si avvicina molto al nostro modo di rappresentare la realtà.

Creare una Struct con il linguaggio Swift

Pensa nuovamente al triangolo.

Quando pensi alla figura del triangolo quello che fai è vederlo nel complesso, ma sai benissimo che nello specifico è formato da 3 vertici, 3 lati, ha una base, un’altezza e tante altre proprietà.

Il triangolo quindi è un involucro di tante proprietà.

Con le Struct in Swift sei in grado di creare l’involucro di un oggetto reale. In questa maniera avrai l’involucro Punto che al suo interno conterrà le due variabili X e Y che ne rappresentano le coordinate. Poi avrai un altro involucro Triangolo che al suo interno avrà il riferimento all’involucro Punto per la descrizione dei vertici ecc ecc.

La sintassi è abbastanza semplice. Viene fatta precedere, al nome della struttura, la parola chiave struct. A seguire si aprono le parentesi graffe e al loro interno vengono definite le variabili che rappresenteranno la struct.

Esercizio 0. Crea la struct che rappresenta un Punto.

Le variabili all’interno di una struct vengono chiamate proprietà della Struct. Quando parlerò di proprietà mi riferirò sempre alle variabili contenute all’interno della struct.

Le struct in Swift come si creano

Combinare le Strutture

Le strutture possono combinarsi più o meno come visto per le funzioni di funzioni. Ad esempio un triangolo, che è definito a partire da 3 punti, avrà al suo interno il riferimento a 3 strutture Punto.

Esercizio 1. Crea la struct di un Triangolo a partire dalla struct Punto.

Strutture innestate linguaggio swift

Istanziare una Struct. Cos’è l’istanza e come effettuarle.

Nel linguaggio Swift, le strutture rappresentano la definizione di un nuovo tipo di dato, alla stessa maniera o simile a quanto succedeva con il tipo enumerativo.

Le buone maniere del programmatore sanciscono che:

  • La prima lettera del nome deve essere Maiuscola, come lo sono Int, String, Double, ecc. (I tipi di Dato fondamentali sono anch’essi delle struct o meglio delle classi).
  • Il nome di una struct deve essere inequivocabile, dal nome devi capire cosa potrai rappresentare e cosa no! Come un Int rappresenta gli Interi e i Double i Reali, lo stesso dovrai fare tu con il nome delle struct.
  • Le funzioni (le vedrai nella prossima lezione) e le variabili al suo interno devono iniziare con la prima lettera minuscola.

Fino ad ora ti sei limitato a creare la definizione di un tipo che finché non viene utilizzato puoi considerarlo come astratto.

Ti ricordi cosa facevi per le funzioni? Più o meno il corpo di una struct è l’equivalente della definizione di un corpo di una funzione. Infatti con la funzione definivi il comportamento ma di per se il codice non veniva eseguito fin quando la funzione non veniva chiamata dal codice del blocco utente.

Lo stesso accade per le struct, la definizione è astratta, rappresenta solamente com’è “strutturato” quel nuovo tipo di dato e come deve funzionare.

Cos’è un’Istanza

Una istanza è la rappresentazione reale di una struttura.

Ovvero il Punto è qualcosa di reale solo e solamente se vengono assegnati dei valori agli attributi X e Y. Ovviamente un Punto è anche diverso da un altro perché, oltre a poter avere coordinate diverse, potrebbero esistere più Punti che vivono nelle stesse coordinate ma che rappresentano figure completamente diverse. Un po’ come se ogni Punto, una volta creato, avesse una struttura tutta per lui che gestisce e lo modifica a suo piacimento.

Lo stesso per l’esempio della Casa e del Residance. La struttura rappresenta un modello della casa. Cioè ti dice da cosa sarà composta ma non ti da nessun informazione sui valori delle varie case. Solamente istanziando la struttura, ovvero assegnando dei valori alle sue Proprietà, potrai descrivere realmente una casa.

Creare un’istanza di una struct in Swift

Per utilizzare un tipo struct devi creare unistanza di quella struttura.

Tu hai già creato istanze solo che non ci hai mai fatto caso. Quando crei una variabile e gli assegni un numero, in realtà, stai creando una istanza della struct che rappresenta quel numero.

La stessa operazione ovviamente puoi farla con le struct. L’istanza di un Punto, ad esempio, diventa così:

Per istanziare una struct devi scrivere il suo nome seguito dalle parentesi tonde, all’interno delle quali vanno inizializzate le variabili che compongono la struct. In questo esempio p1 è un punto che ha ascissa = 0 e ordinata = 0. La sintassi è qualcosa che ricalca la chiamata di una funzione e il passaggio di valori ai parametri.

Adesso istanzia altri due punti e prova a creare un triangolo:

Istanziare una Struct

Un altro modo di istanziare le struct

Se all’interno delle struct avessi definito per le variabili dei valori concreti o opzionali, Swift ti avrebbe offerto un modo veloce di istanziare la struct. Ti faccio l’esempio definendo la struct che rappresenta la risoluzione di uno schermo (1024 x 768, ecc.).

Dato che non possono esistere risoluzioni negative, assegno all’interno della struct valore di altezza e larghezza uguali a zero.

In questa maniera, quindi con le variabili già istanziate all’interno della definizione, quando istanzierai una struct potrai omettere l’inizializzazione delle variabili in quanto già concretizzate/istanziate nel modello della struct:

Sempre seguendo questa falsa riga continua definendo la struct di una modalità video (HD, full HD, ecc.):

Attenzione! All’interno di una Struct non puoi istanziare altre struct, ovvero l’operazione “var risoluzione = Risoluzione()” non creerà una istanza risoluzione all’interno di quella struct bensì passerà i valori di default di quella struct.

Istanzia quest’ultima struct:

Come puoi notare dall’esempio qui sopra, ho passato la risoluzione hd come parametro dell’istanziazione di un’altra Struct.

Accedere alle proprietà di una struttura

Puoi accedere alle proprietà di una struct con il nome della variabile, seguita da un punto più il nome della proprietà:

Puoi accedere anche alla struct che compone una proprietà di un’altra struct:

Modifica di una proprietà

Puoi utilizzare questa notazione per cambiare il valore di una proprietà:

Leggere e modificare il valore di una proprietà Struct in swift

La struttura di una lista della spesa. Un esempio d’utilizzo di una struttura con il linguaggio Swift

Comunque spostiamo l’attenzione su qualcosa dall’immediata fattibilità.

Ti ricordi che in un esercizio, di qualche lezione fa, ti ho fatto creare un algoritmo cui compito era quello della gestione di una lista della spesa? 

Adesso voglio riproportelo utilizzando le strutture.

Un alimento è qualcosa che viene associato ad una categoria e a un nome, ad esempio la cotoletta fa parte della categoria carne. Ma un alimento può essere contenuto in più categorie (dolce e salato).

Quindi vuol dire che un alimento X generico può essere descritto dalla seguente struttura:

In questo modo la lista per la gestione degli alimenti si riduce, da un dizionario, ad una semplice lista di alimenti:

Ogni elemento dell’array listaSpesa è un alimento, ovvero un’istanza della Struct Alimento. Infatti se accedi ad un elemento della lista, quello che ottieni è il riferimento ad un alimento:

Anche se per ora non noti la differenza tra i due tipi di implementazione, nelle prossime lezioni ti farò ricredere.

Sai che questo tipo di struttura è stata utilizzata per realizzare un’app? Scopri di più visualizzando uno dei tutorial più letti del blog: Creare una Table View con ricerca in Swift.

Considerazioni ed Esercizi da svolgere

Con le struct, con le classi lo noterai di più, il tuo modo di programmare cambierà drasticamente. Già da questi semplicissimi esempi puoi notare come la programmazione si sta spostando, dal semplice scrivere codice, all’immaginare i componenti del codice.

Tutto questo non sarebbe mai accaduto se non avessi utilizzato le struct le quali sono state introdotto proprio per sopperire alla mancanza di strumenti che avvicinassero il codice al nostro modo di pensare.

Nella prossima lezione ti mostrerò come personalizzare una struct in Swift.

Esercizi da svolgere

Prova a risolvere i seguenti esercizi e, qualora avessi delle difficoltà, lascia un commento.

  • Esercizio 2. Scrivi la struttura generica di un’appartamento. La struttura deve avere alcune proprietà come: nome, metri_quadri, numero_stanze, ecc.
  • Esercizio 3. Utilizzando la struttura precedente, crea una nuova struttura dati per la rappresentazione di un palazzo. Il palazzo deve essere formato da più appartamenti ed in più deve possedere le seguenti proprietà: nome, via, numero_appartamenti.

Buona Programmazione!

Torna a: Corso gratuito linguaggio di programmazione Swift > Dettagli e sfumature del linguaggio Swift

Start typing and press Enter to search

enum in swiftClosure in Swift