Set, benzersiz elemanların sırasız bir koleksiyonudur ve hash tablosu olarak uygulanmıştır. Array'den en önemli farkı, tekrar eden değerlerin olmaması ve sıralamanın olmamasıdır. Temel arayüzler: ekleme yöntemleri (insert), silme (remove), varlık kontrolü (contains).
İşlem Süresi:
insert, remove ve contains işlemleri ortalama O(1) sürede çalışır.Kullanım örneği:
var numbers: Set<Int> = [1, 2, 3] numbers.insert(4) // Set: 1, 2, 3, 4 numbers.insert(2) // Set değişmeyecek, 2 zaten mevcut numbers.remove(1) // Set: 2, 3, 4 print(numbers.contains(3)) // true
Set'i, benzersizliğin önemli olduğu ancak sıralamanın önemli olmadığı durumlarda kullanın. Array ile karşılaştırın:
Array'de bir eleman silme ve arama O(n) sürede gerçekleşir.Array'de aynı değerlerin bulunmasına izin verilir.Set, ∪, ∩, −, ⊆, ⊇ gibi diğer küme teorisi işlemlerini destekler.
Soru:
Aşağıdaki kod derlenecek mi ve neden?
let set: Set = [[1, 2], [3, 4]]
Cevap:
Hayır, derlenmeyecek. Set, elemanların türünün Hashable protokolüne uymasını gerektirir. Dizi (Array), Hashable'ı uygulamadığı için dizi kümeleri doğrudan oluşturulamaz. Örneğin, Set<Int> doğrudur, ancak Set<[Int]> değildir.
Hikaye
Bir hizmette, geliştiriciler nesnelerin benzersiz tanıtıcılarını [Int] olarak saklıyorlardı, Set<Int> olarak değil. Bu, varlık kontrollerinin ve silme işlemlerinin yavaş çalışmasına (süre - O(n)) neden oldu, tekrar eden değerler ortaya çıktı ve iş mantığı bozuldu.
Hikaye
Set'e standart dışı türler (örneğin, Set<MyModel> oluşturmak) konulmaya çalışıldı, ancak tür Hashable'ı uygulamıyordu. Kod, uygun protokoller eklenince derlendi, ancak hash(into:)'deki hatalar çakışmalara ve çalışma sırasında öngörülemeyen davranışlara neden oldu.
Hikaye
Bir geliştirici, Set içindeki elemanların sıralanma sıranın ekleme sırasıyla aynı olacağını bekliyordu ve UI'yi bu sıraya göre inşa etti. Sonuçta, her çalıştırmada sıralama farklıydı, bu da son kullanıcının verilerin tutarsız görüntülenmesine neden oldu.