In questa lezione continuiamo a parlare delle Classi!
Nella prima lezione abbiamo visto a livello teorico cosa è una classe, un oggetto e l’istanza della classe.
Ricordiamo allora che:
- Una Classe è il modello astratto di un oggetto, uno schema che rappresenta in modo concettuale un oggetto.
- Un oggetto è La rappresentazione reale della classe, tramite l’istanza della classe.
Il Costruttore è una funzione particolare che serve, per l’appunto, a definire quali saranno i valori reali da dare all’oggetto al momento della sua creazione.
Il Costruttore o init è una funzione del linguaggio Swift a tutti gli effetti. Come parametri si mettono gli stessi attributi della classe che si vorranno inizializzare quando si creerà l’oggetto.
Gli attributi di una classe possono essere di 2 tipi o di tipo opzionale o inizializzati con un valore. Detto questo vediamo le possibili configurazioni del costruttore.
Costruttore o init senza Parametri
// Classe Persona con parametri opzionali class Persona { // Attributi var nome: String? var cognome: String? var eta: Int? var codiceFiscale: String? // Costruttore Vuoto init(){ } } // Fine Classe
In questo Esempio ho creato una Classe Chiamata Persona, ho creato gli attributi dichiarando il tipo e l’opzionalità. Ho creato il mio init senza nessun parametro in ingresso e nessun codice al suo interno.
Ho potuto fare questo perché tutti i Suoi attributi sono di tipo opzionale.
Ora vediamo come creare una istanza della classe Persona
// Istanza Classe Persona var francesco = Persona() // Assegno un valore agli attributi della Classe francesco.nome = "Francesco" francesco.cognome = "Rossi" francesco.eta = 45 francesco.codiceFiscale = "aaaabbbbccccc" if francesco.codiceFiscale != nil { print(francesco.codiceFiscale!) } else{ print("Nessun Codice Fiscale inserito") }
Nell’esempio ho creato una variabile francesco e gli ho assegnato come valore un’istanza della classe Persona scrivendo il nome della classe con aperta chiusa parentesi tonda ( questo perché, ripeto, ho creato un init senza l’obbligo di parametri in ingresso in quanto opzionali).
Successivamente ho richiamato la mia istanza “francesco” ed essendo un istanza di persona posso accedere ai suoi attributi tramite il punto e gli ho assegnato dei valori.
Poi ho fatto un esempio di controllo sull’attributo codiceFiscale, infatti ricordiamo che se una variabile/costante viene contrassegnata come opzionale essa può assumete 2 valori, nil o contenere un dato reale.
Quindi tramite un if ho controllato se la variabile codiceFiascle è nil, quindi senza valore, se si, stampa “Nessun codice Fiscale inserito”, se contiene un dato invece stampa il codice Fiscale.
Costruttore o init con Parametri
class Persona{ // Attributi var nome: String var cognome: String var eta: Int var codiceFiscale: String // Costruttore con Parametri init(nome: String, cogonme: String, eta: Int, codiceFiscale: String){ self.nome = nome self.cognome = cogonme self.eta = eta self.codiceFiscale = codiceFiscale } } // Creo una istanza di Persona var francesco = Persona(nome: "Francesco", cogonme: "Rossi", eta: 34, codiceFiscale: "aaabbbccc")
In questo esempio a differenza del precedente agli attributi gli ho assegnato solo i il tipo di dato, quindi gli attributi non essendo di tipo opzionale devo per forza avere un valore e quindi sono costretto a richiederli tramite il costruttore durante la creazione di una istanza della classe altrimenti il compilatore mi notificherebbe errore.
Per questo motivo quando ho creato una istanza della classe Persona ho scritto il nome della classe dove tra le parentesi tonde ho passato i parametri obbligatori richiesti dal costruttore.
A questo punto dovresti aver notato che nel corpo del costruttore ho inserito una parola chiave , self seguita dal punto e il nome della variabile.
A cosa serve? Se noti io ho chiamato sia gli attributi della classe sia i parametri del costruttore con lo stesso nome quindi senza mettere questa key, il compilatore potrebbe andare in confusione in quando mi potrebbe direbbe, devo inserire il valore dell’attributo nel parametro del costruttore o il valore del parametro del costruttore nell’attributo?
E’ vero! Avrei potuto chiamare i parametri del costruttore diversamente ma così facendo avrai creato altri 4 nomi che sempre nella logica di scrivere meno codice possibile e sopratutto ridurre al minimo la possibilità di errore (anche perché come vedrai nel corso IOS) è prassi utilizzare questa forma.
Quindi quando si mette il la key self sto dicendo al compilatore che quella chiamata si riferisce sempre all’attributo della classe. Nel nostro esempio gli dico self.nome = nome che appunto significa assegna all’attributo della classe chiamato nome il valore del parametro nome del costruttore.
Prima di chiudere questa lezione vorrei dirti che è possibile anche utilizzare entrambe le tipologie ovvero sia attributi opzionali che obbligatori, in più possiamo anche senza problema inserire il richiamo nel costruttore di attributi opzionali (in questo caso abbiamo la possibilità di inserire un valore o nil), infine possiamo creare anche più di un costruttore, l’importante che non siano uguali.
Di seguito ti faccio un esempio
class Persona{ // Attributi var nome: String var cognome: String var eta: Int var codiceFiscale: String? // Costruttore con campi obbligatori init(nome: String, cognome: String, eta: Int){ self.nome = nome self.cognome = cognome self.eta = eta } // Altro costruttore con aggiunta dell campo opzionale init(nome: String, cognome: String, eta: Int, codiceFiscale: String?) { self.nome = nome self.cognome = cognome self.eta = eta self.codiceFiscale = codiceFiscale } } // Richiamo del Primo Costruttore var francesco = Persona(nome: "Francesco", cognome: "Rossi", eta: 43) // Successiva assegnazione di un valore al codice fiscale opzionale francesco.codiceFiscale = "FFFGFGFGF" // Richiamo secondo costruttore passando nil al parametro opzionale var francesco = Persona3(nome: "Francesco", cognome: "Rossi", eta: 45, codiceFiscale: nil) // Richiamo al secondo costruttore con assegnazione di valore al campo opzionale var francesco4 = Persona3(nome: "Francesco", cognome: "Rossi", eta: 45, codiceFiscale: "aaabbbccc")
Per qualunque dubbio o domanda scrivi un commento in questa lezione.