W Swift istnieją trzy podstawowe standardowe kolekcje: Array, Set i Dictionary. Każda z nich implementuje różne interfejsy, różni się wewnętrzną strukturą i jest przeznaczona do różnych zadań.
Historia pytania:
W Swift kolekcje są zaprojektowane z naciskiem na bezpieczeństwo typów (type safety) i wydajność, w tym semantykę wartości i kopiowanie na zasadzie Copy-on-Write dla Arrays/Set/Dictionary.
Problem:
Często początkujący programista używa tylko Array tam, gdzie poprawniej byłoby zastosować Set lub Dictionary, co prowadzi do marnotrawstwa pamięci i obniżenia prędkości dostępu/wyszukiwania. Należy zrozumieć różnice.
Rozwiązanie:
Uporządkowana kolekcja elementów, dostęp przez indeks, możliwe duplikaty. Zwykle realizowane przez dynamiczny bufor.
Nieuporządkowana kolekcja unikalnych elementów (Hashable). Dostęp przez hash — bardzo szybki, duplikaty są niedopuszczalne.
Kolekcja par klucz-wartość. Klucz musi być Hashable. Dostęp do wartości przez klucz (poprzez tablicę haszującą).
Przykład kodu:
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] — duplikaty są odrzucane
Kluczowe cechy:
Czy można używać typów non-Hashable jako elementów Set lub Dictionary?
Nie. Aby przechowywać w Set/Dictionary, element musi być Hashable (mieć unikalny identyfikator haszujący). W przeciwnym razie kompilator nie pozwoli na stworzenie kolekcji.
struct Point {} // Set<Point> spowoduje błąd, ponieważ Point nie jest Hashable
Czy porządek przechowywania elementów Set jest taki sam, jak podczas ich dodawania?
Nie. Set nie gwarantuje porządku — iteracja może dać dowolny porządek. Jeśli potrzebujesz porządku, użyj Array.
Co się stanie, gdy spróbujesz uzyskać dostęp do nieistniejącego klucza w Dictionary?
Dictionary zwróci Optional. Bądź ostrożny — próba uzyskania wartości dla nieistniejącego klucza zwróci nil, a nie błąd.
let val = dict["not exist"] // val — nil
Programista do unikalnej listy użytkowników używa Array i szuka unikalności za pomocą contains. Na dużych listach — dużo czasu na sprawdzenia.
Zalety:
Wady:
Ta sama lista zrealizowana jako Set. Sprawdzenie obecności — natychmiastowe, unikalne wartości gwarantowane.
Zalety:
Wady: