In Swift ci sono tre collezioni standard principali: Array, Set e Dictionary. Ognuna di esse implementa interfacce diverse, differisce per struttura interna ed è destinata a compiti diversi.
Storia della domanda:
In Swift, le collezioni sono progettate con un focus sulla sicurezza dei tipi (type safety) e sulle prestazioni, inclusi value semantics e copia in base al principio Copy-on-Write per Arrays/Set/Dictionary.
Problema:
Spesso i nuovi sviluppatori utilizzano solo Array dove sarebbe più corretto usare Set o Dictionary, portando a un eccesso di utilizzo della memoria e a una riduzione della velocità di accesso/ricerca. È importante comprendere le differenze.
Soluzione:
Collezione ordinata di elementi, accesso per indice, ammesse duplicazioni. Implementata solitamente tramite un buffer dinamico.
Collezione non ordinata di elementi unici (Hashable). Accesso tramite hash - molto veloce, non sono ammessi duplicati.
Collezione di coppie chiave-valore. La chiave deve essere Hashable. Accesso al valore tramite chiave (tramite una tabella hash).
Esempio di codice:
var arr: [Int] = [1, 2, 3, 4] var set: Set<Int> = [1, 2, 2, 3] var dict: [String: Int] = ["a": 1, "b": 2] // set == [1, 2, 3] — i duplicati vengono scartati
Caratteristiche chiave:
È possibile utilizzare tipi non Hashable come elementi di Set o Dictionary?
No. Per essere memorizzato in Set/Dictionary, un elemento deve essere Hashable (avere un identificatore hash unico). Altrimenti, il compilatore non consentirà di creare la collezione.
struct Point {} // Set<Point> genererà un errore, poiché Point non è Hashable
L'ordine di memorizzazione degli elementi in Set è lo stesso di quando vengono aggiunti?
No. Set non garantisce l'ordine - l'iterazione può fornire un qualsiasi ordine. Se hai bisogno dell'ordine, usa Array.
Cosa succede quando si tenta di accedere a una chiave non esistente in Dictionary?
Dictionary restituirà un Optional. Fai attenzione - tentare di accedere a una chiave non esistente restituirà nil, non un errore.
let val = dict["not exist"] // val — nil
Uno sviluppatore utilizza Array per un elenco unico di utenti e cerca unicità tramite contains. Su grandi elenchi - molto tempo per le verifiche.
Vantaggi:
Svantaggi:
Lo stesso elenco implementato come Set. La verifica della presenza è istantanea, i valori unici sono garantiti.
Vantaggi:
Svantaggi: