In Swift fin dall'inizio si è posto l'accento sui value types — le strutture (struct) come strumento principale per la modellazione dei dati. A differenza di Objective-C, dove tutto era oggetti (classi), Swift incoraggia l'uso delle strutture per modelli semplici, dati e piccoli oggetti business.
Molti sviluppatori, soprattutto quelli con esperienza in altri linguaggi orientati agli oggetti, usano erroneamente le classi per tutto. Questo porta a problemi di memoria (riferimento cicli), cambiamenti inattesi durante la trasmissione degli oggetti e difficoltà con la thread safety, poiché le classi sono reference types.
Le strutture in Swift sono value types, vengono copiate durante l'assegnazione e la trasmissione in funzioni, a differenza delle classi (reference types), che passano solo un riferimento. Questo rende le strutture preferibili per modelli senza logiche di vita complesse e senza ereditarietà.
Esempio di codice:
struct Point { var x: Int var y: Int } var p1 = Point(x: 10, y: 20) var p2 = p1 p2.x = 30 // p1.x rimane uguale a 10
Caratteristiche chiave:
Una struttura può avere un erede (subclass)?
No, le strutture in Swift non supportano l'ereditarietà. Qualsiasi estensione del comportamento è possibile solo attraverso protocolli ed estensioni.
Significa che la struttura viene sempre copiata durante la trasmissione in funzione?
Nella pratica, Swift utilizza ottimizzazioni Copy-On-Write. Se non modifichiamo la struttura, non viene copiata, e la copia viene creata solo al momento della modifica. Questo vale per le collezioni standard e le strutture complesse.
var arr1 = [1, 2, 3] var arr2 = arr1 arr2.append(4) // Solo qui avviene la copia
In quali casi non si può utilizzare una struttura?
Utilizzo di classi per memorizzare dati omogenei (ad esempio, per punti su una mappa), come risultato — perdite di prestazioni dovute a frequenti accessi alla memoria, gestione complessa della memoria e bug con riferimenti invertiti.
Vantaggi:
Svantaggi:
Utilizzo di strutture per modelli di dati che vengono copiati in modo sicuro, che non portano a perdite e non hanno complessità inutili.
Vantaggi:
Svantaggi: