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:
insert, remove e contains funzionano, in media, in O(1).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:
Array avviene in O(n).Array sono consentiti valori duplicati.Il set supporta: ∪, ∩, −, ⊆, ⊇ e altre operazioni di teoria degli insiemi.
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 è.
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.