Home Testo Corso Swift Strutture

Strutture

573
0
Strutture

In questa lezione vediamo una forma di gestione dei dati simili alle classi.

Una struct è simile ad una classe ma è sottoposta a molte più limitazioni e in determinati scenari questo ne rappresenta i punti di forza.

Negli ultimi anni Apple sta convertendo molte classi centrali di Cocoa (come NSString, NSArray, NSDictionary, NSSet, NSURL, …) in altrettante struct (String, Array, Dictionary, Set, URL).

struct Nome {
 
// Attributi/Proprietà
 
// Metodi
 
}

Ora ti faccio vedere un esempio di struttura e ti indicherò le differenze rispetto a una classe

struct Clienti {
    
    var nome: String
    var saldo: Double
       
    mutating func aggiugni(importo: Double){
        
        self.saldo += importo
    }
}

struct Archivio{

    var array = [Clienti]()

    mutating func aggiungi(cliente: Clienti){
        
        array.append(cliente)    
    }
}

var francesco = Clienti(nome: "Francesco", saldo: 1000)
francesco.aggiugni(importo: 500)

var archivioClienti = Archivio()
archivioClienti.aggiungi(cliente: francesco)

Nell’esempio ho creato una struttura Clienti che ci permette di inserire un nuovo cliente con codice e saldo e aggiungere tramite un metodo una somma al saldo poi ho creato una struttura Archivio dove come proprietà ha un array con tipo di dato la struttura Clienti e un metodo che permette di inserire un nuovo cliente nella array.

Avrei potuto fare la stessa cosa utilizzando un classe. Ma vediamo le differenze tra una classe e una Struttura.

In una struttura:

  • Se non specificato crea un init di default
  • Non è possibile utilizza l’ereditarietà
  • Per cambiare il valore degli Attributi della Struttura bisogna utilizzare la parola chiave mutating prima della key func in quanto essi vengono considerati costanti come hai visto nelle funzioni dove però li si utilizza il parametro inout.
  • Una struct è un value type mentre una classe è di tipo Reference Type
  • La struct è più veloce di una classe

Ora soffermiamoci sulla differenza tra value type e Reference Type

Una classe è di tipo Reference Type, vediamo un esempio

class Utente{
    
    var nome : String = ""
}

// Creo una istanza della classe
var a = Utente()

// Assegno alla proprietà nome della istanza a  un valore
a.nome = "Francesco"
print(a.nome)// Stampa francesco

// Assegno alla variabile b l'istanza a
var b = a
print(b.nome) // Stampo b.nome che è uguale a nome di a: francesco

// Cambio il valore di b.nome in carlo
b.nome = "Carlo"

// Stampo sia a che b 
print(b.nome) // Carlo

print(a.nome)// Carlo

// Cambio valore di a
a.nome = "Lucia"

// Stampo si a che b
print(b.nome)// Lucia
print(a.nome)// Lucia

Come puoi notare cambiando uno dei 2 valori l’altro assume lo stesso valore.

La modifica di b.nome ha comportato pure la modifica di a.nome e viceversa. Più in generale, la modifica dell’oggetto conservato in b ha avuto come conseguenza anche la modifica dell’oggetto conservato in a.

Come mai? Perché una classe come ho detto è di tipo Reference Type

Reference Type significa che il passaggio di un oggetto, nato da una classe, verso una var/let implica il solo passaggio del riferimento a quell’oggetto.

Questo vuol dire che, l’oggetto contenuto in b e quello contenuto in a, sono lo stesso identico oggetto. A livello di memoria, la var a e la var b puntano esattamente allo stesso identico indirizzo di memoria.

Una struct è un value type

struct Utente{
    
    var nome: String = ""
}

// Creo un istanza della struttura assegnato il valore Francesco
var a = Utente(nome: "Francesco")

print(a.nome) // Stampa Francesco

// Assegno a b l'istanza a
var b = a

// Stampo b
print(b.nome)// Stampa francesco

// Assegno a b il valore Carlo
b.nome = "Carlo"

// Stampo a e b 
print(b.nome) // Carlo
print(a.nome) // Francesco

Come puoi notare ora cambiando il valore di b in Carlo il valore di a rimane Francesco

il passaggio di un oggetto, nato da una struct, da a verso b implica la creazione di un nuovo oggetto copia dell’oggetto passato quindi sono considerate come due istanze diverse.

Non entro nello specifico ma la Struct è più veloce di una classe come ho detto dell’ultimo punto perché i valori di una struct vengono salvati nello stack mentre gli oggetti delle classi nell’heap (o free space). Lo stack è un’area di memoria più veloce e spesso viene addirittura rappresentata nella memoria interna della CPU.

Ora, è meglio utilizzare la Struct o una Classe?
A priori non si può dire anche se simili come abbiamo visto hanno delle caratteristiche diverse quindi a secondo delle necessità potrai scegliere se utilizzare una forma o l’altra.

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