Home Testo Corso Swift Classi – Getter e Setter

Classi – Getter e Setter

2419
0
Classi Swift

In questa lezione continuiamo a parlare delle Classi nello specifico vedremo il get e set di una proprietà!

Nelle lezioni precedenti abbiamo visto a livello teorico cosa è una classe, un oggetto e l’istanza della classe. Abbiamo visto poi come creare una classe in Swift, i relativi attributi, come gestirli tramite l’Opzionalità e i costruttori, abbiamo visto i metodi di una classe e come utilizzare una classe come tipo di dato.

Abbiamo visto nei diversi esempi fatti che una volta assegnata una istanza di un classe a una variabile/constante tramite l’utilizzo del punto dopo il nome della istanza possiamo accedere alla sue proprietà e metodi.

Ora se avessi la necessità di impedire la modifica di questa proprietà? Vediamo subito con un esempio:

class Saldo{

    var saldo: Double
    
    init(saldo: Double) {
        self.saldo = saldo
    }
    
    func stampaSaldo(){      
        print("il Tuo saldo e \(self.saldo)")
    }
}

var  francesco = Saldo(saldo: 1000)
francesco.saldo = 10000

Nell’esempio ho creato una classe chiamata Saldo con una proprietà chiamata saldo poi ho assegnato alla variabile francesco l’istanza della classe.

Ora come detto francesco è una istanza della classe Saldo quindi posso accedere alla proprietà saldo tramite il punto dopo il nome dell’istanza e poter modificare il saldo come nell’esempio da 1.000 a 10.000.

A livello teorico e pratico nessun problema ma se quella classe gestisse un conto corrente sarebbe un bel problema poter modificare in modo così diretto quella proprietà.

Potrei risolvere questo problema utilizzando i modificatori di accesso.

I Modificatori di accesso, sono delle parole chiave che ci permettono di definire in che modo può essere vista all’estero una classe, una proprietà, una funzione, un variabile.

I modificatori sono 4: private, internal, fileprivate e public

In questa lezione non entrò nel dettaglio in quanto per vedere il loro utilizzo dovrei avere un progetto con più file.

Parlerò in modo superficiale solo modificatore private che ci servirà per introdurre l’argomento della lezione.

// Classe Saldo con il modificatore di accesso Private
class Saldo{
   
   private var saldo: Double
    
    init(saldo: Double) {
        self.saldo = saldo
    }
    
    func stampaSaldo(){      
        print("il Tuo saldo è \(self.saldo)")
    }
}

var francesco = Saldo(saldo: 1000)

quindi nell’esempio sopra, ho aggiunto la key private prima della dichiarazione della proprietà saldo “private var saldo: Double”. In questo modo ho reso invisibile questa proprietà all’esterno della classe quindi se adesso provo a richiamarla dopo il punto essa non è più visibile.

Ora vediamo come poter effettuare la stessa operazione utilizzando la key get:

class Saldo {

    private var saldo: Double
    
    var saldoConto: Double {
    
        get{
            return self.saldo
        }
    }
    
    init(saldo: Double) {
        self.saldo = saldo
    }
}

var francesco3 = Saldo3(saldo: 3000)
print("il tuo saldo3 è (francesco3.saldoConto)")

sopra ti ho detto che ho effettuato la stessa operazione tramite l’utilizzo del get ma come puoi vedere ho lasciato la proprietà saldo in modo private che conterrà il valore reale ma tramite la creazione di un altra variabile saldoConto utilizzando la forma get permetto la lettura del contenuto della proprietà saldo senza esporla all’estremo richiamandola tramite la proprietà saldoConto.

Per creare una proprietà get di scrive:

var nomeProprietà: TipoDiDato {
 
    get {
          return TipoDiDato
    }
}

quindi nel nostro caso ho creato la proprietà saldoConto e nel get leggo il valore della proprietà saldo utilizzando il return.

Ora così facendo ho la possibilità di leggere il valore di saldo, ma se ho la necessità di modificare il valore del saldo? Ecco che qui mi viene in aiuto la parola chiave set

class Saldo {
    
    private var saldo: Double
    
    var saldoConto: Double {
        
        get{
            return self.saldo
        }
        set(nuovoValore){
            print("il nuovo saldo è: \(nuovoValore)")
            self.saldo = nuovoValore
        }
    }
    
    init(saldo: Double) {
        self.saldo = saldo
    }
}

var francesco = Saldo4(saldo: 6000)
francesco.saldoConto = 8000

Nell’esempio dopo il get ho aggiunto un’altra istruzione chiama set dove tra parentesi tonde ho inserito il nome di una variabile di appoggio che recupererà il valore che assegnerò alla proprietà saldoConto e trasferirà il valore alla proprietà nascosta Saldo come da istruzione racchiusa tra le parentesi graffe.

A questo punto potresti farti una domanda, perché dovrei utilizzare il get e set per cambiare il valore di una variabile quando potrei farlo senza il loro utilizzo?

Il perché è semplice, se per esempio quel saldo è utilizzato per ipotesi in diversi metodi della classe tipo per l’aggiunta di una somma, la sottrazione di una somma… avrei dovuto in ogni metodo effettuare dei controlli prima di effettuare l’operazione ora utilizzando questa forma posso effettuare questi controlli una sola volta direttamente nel set.

class Saldo {
    
    private var saldo: Double
    
    var saldoConto: Double {
        
        get{
            return self.saldo
        }
        set(nuovoValore){
            
            if nuovoValore < 0{
            
                print("Stai provando a inserire un valore negativo")
                return
            }
            
            self.saldo =  self.saldo + nuovoValore
            print("il nuovo saldo5 è: \(self.saldo)")
        }       
    }
    
    init(saldo: Double) {
        self.saldo = saldo
    }
}

var francesco = Saldo(saldo: 1000)
francesco.saldoConto = 300

Nell’esempio ho inserito nel get un controllo per verificare se il valore inserito e di tipo negativo se si, restituisci un errore ed esce. Questo era solo un banale esempio ma nel get posso inserire qualunque tipo di controllo e operazione.

Importante da dire che:

  • Può esistere un get senza un set ma non può esistere un set senza get.

Quando poi si utilizza solo il get possiamo utilizzare anche una forma detta contratta dove è possibile omettere la parola get come nell’esempio di seguito:

class Saldo {

    private var saldo: Double
    
    var saldoConto: Double {
          
            return self.saldo
    }
    
    init(saldo: Double) {
        self.saldo = saldo
    }
}

Per qualunque dubbio o domanda scrivi un commento in questa lezione.