ProgrammazioneJunior iOS developer

Quali sono i tipi di collezioni in Swift, come differiscono per implementazione interna e quando utilizzare ciascuna collezione?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

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:

Array

Collezione ordinata di elementi, accesso per indice, ammesse duplicazioni. Implementata solitamente tramite un buffer dinamico.

Set

Collezione non ordinata di elementi unici (Hashable). Accesso tramite hash - molto veloce, non sono ammessi duplicati.

Dictionary

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:

  • Array è efficiente per accesso per indice, mantiene l'ordine, ma l'accesso per valore è lineare
  • Set è veloce per ricerca e verifica della presenza di un elemento, conserva solo valori Hashable unici
  • Dictionary è ottimale per ricerca per chiave (Hashable), non conserva l'ordine, ma cerca e modifica valori rapidamente

Domande insidiose.

È 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

Errori tipici e anti-pattern

  • Utilizzare Array per cercare un valore unico (meglio Set)
  • Utilizzare Dictionary per memorizzare valori senza necessità di ricerca per chiave
  • Tentare di utilizzare tipi non Hashable come chiavi/valori

Esempio dalla vita reale

Caso negativo

Uno sviluppatore utilizza Array per un elenco unico di utenti e cerca unicità tramite contains. Su grandi elenchi - molto tempo per le verifiche.

Vantaggi:

  • Semplicità di implementazione

Svantaggi:

  • Complessità lineare di ricerca, eccessivo utilizzo di memoria per duplicati

Caso positivo

Lo stesso elenco implementato come Set. La verifica della presenza è istantanea, i valori unici sono garantiti.

Vantaggi:

  • Accesso rapido, risparmio di memoria, eliminazione dei duplicati

Svantaggi:

  • Nessuna garanzia sull'ordine degli elementi