programowanieJunior iOS developer

Jakie są rodzaje kolekcji w Swift, jak różnią się one pod względem wewnętrznej implementacji i kiedy używać której kolekcji?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

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:

Array

Uporządkowana kolekcja elementów, dostęp przez indeks, możliwe duplikaty. Zwykle realizowane przez dynamiczny bufor.

Set

Nieuporządkowana kolekcja unikalnych elementów (Hashable). Dostęp przez hash — bardzo szybki, duplikaty są niedopuszczalne.

Dictionary

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:

  • Array jest efektywny dla dostępu przez indeks, utrzymuje porządek, ale dostęp przez wartość jest liniowy
  • Set jest szybki w wyszukiwaniu i sprawdzaniu obecności elementu, przechowuje tylko unikalne wartości Hashable
  • Dictionary jest optymalny dla wyszukiwania przez klucz (Hashable), nie zachowuje porządku, ale szybko wyszukuje i zmienia wartości

Pytania z pułapką.

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

Typowe błędy i antywzorce

  • Używanie Array do wyszukiwania unikalnej wartości (lepiej użyć Set)
  • Używanie Dictionary do przechowywania wartości bez konieczności wyszukiwania według klucza
  • Próba użycia typów non-Hashable jako kluczy/wartości

Przykład z życia

Negatywny przypadek

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:

  • Prostota realizacji

Wady:

  • Liniowa złożoność wyszukiwania, nadmierne przechowywanie duplikatów, duże obciążenie pamięci

Pozytywny przypadek

Ta sama lista zrealizowana jako Set. Sprawdzenie obecności — natychmiastowe, unikalne wartości gwarantowane.

Zalety:

  • Szybki dostęp, oszczędność pamięci, eliminacja duplikatów

Wady:

  • Brak gwarancji porządku elementów