ProgrammazioneSviluppatore iOS

Parla del tipo di dati Set in Swift: le sue caratteristiche, interfacce, tempi di esecuzione delle operazioni e potenziali insidie nell'uso, differenze rispetto all'array (Array).

Supera i colloqui con l'assistente IA Hintsage

Risposta

Set è una collezione non ordinata di elementi unici, implementata come tabella hash. La principale differenza rispetto all'Array è l'assenza di valori duplicati e di ordine. Le interfacce principali: metodi di inserimento (insert), rimozione (remove), verifica della presenza (contains).

Tempi di esecuzione:

  • Le operazioni insert, remove e contains funzionano, in media, in O(1).
  • Iterazione su tutti gli elementi — O(n).

Esempio di utilizzo:

var numbers: Set<Int> = [1, 2, 3] numbers.insert(4) // Set: 1, 2, 3, 4 numbers.insert(2) // Set non cambierà, 2 è già presente numbers.remove(1) // Set: 2, 3, 4 print(numbers.contains(3)) // true

Utilizza Set quando l'unicità è importante, ma l'ordine non lo è. Confronta con Array:

  • La rimozione e la ricerca di un elemento in Array avviene in O(n).
  • In Array sono consentiti valori duplicati.

Il set supporta: ∪, ∩, −, ⊆, ⊇ e altre operazioni di teoria degli insiemi.

Domanda insidiosa

Domanda:

Il seguente codice compilerà e perché?

let set: Set = [[1, 2], [3, 4]]

Risposta: No, non compilerà. Set richiede che il tipo degli elementi implementi il protocollo Hashable. L'array (Array) non implementa Hashable, quindi non è possibile creare insiemi di array direttamente. Ad esempio, Set<Int> è corretto, ma Set<[Int]> non lo è.

Esempi di errori reali dovuti alla mancanza di conoscenza delle sfumature della materia


Storia

In un servizio, gli sviluppatori memorizzavano identificatori unici degli oggetti come [Int], anziché Set<Int>. Ciò causava problemi: le verifiche di presenza e rimozione funzionavano lentamente (tempo — O(n)), si presentavano duplicati e si violava la logica di business.


Storia

Tentativo di inserire in Set tipi non standard (ad esempio, si creava Set<MyModel>), ma il tipo non implementava Hashable. Il codice compilava solo dopo l'aggiunta dei protocolli corrispondenti, ma durante l'implementazione di errori in hash(into:) si verificavano collisioni e comportamenti imprevedibili durante l'esecuzione.


Storia

Lo sviluppatore si aspettava che l'ordine di iterazione degli elementi in Set coincidesse con l'ordine di inserimento, e costruiva l'interfaccia utente nello stesso ordine. Di conseguenza, ad ogni esecuzione, l'ordine era diverso, portando a una visualizzazione incoerente dei dati per l'utente finale.