programowanieProgramista Swift

Jak działa matchowanie wzorców dla zakresów (range) w Swift i jakie cechy należy uwzględnić przy implementacji porównania za pomocą switch?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź

W Swift matchowanie zakresów często używa się w switch-case do porównywania wartości z zakresami. W tym celu stosuje się operatory ..< (half-open range) i ... (closed range):

let score = 76 switch score { case 0..<60: print("Niedostateczny") case 60..<80: print("Dostateczny") case 80...100: print("Doskonały") default: print("Niepoprawna wartość") }

Cechy:

  • Zakresy muszą być rosnące: od mniejszego do większego (w przeciwnym razie zakres będzie pusty).
  • Matchowanie będzie udane, jeśli wartość leży w zakresie.
  • Ponieważ zakresy to struktury, można ich używać do porównywania z dowolnymi typami Comparable.

Pytanie z podstępem

Co się stanie, jeśli w switch użyjemy zakresu z górną granicą, która nie obejmuje wartości (na przykład 0..<5), a zmienna wynosi 5?

Często odpowiadają, że taki case zadziała, ale to nieprawda: operator ..< nie obejmuje górnej granicy. Przykład:

let value = 5 switch value { case 0..<5: print("0-4") case 5: print("pięć") default: print("inne") } // Wyświetli: "pięć"

Przykłady prawdziwych błędów z powodu nieznajomości szczegółów tematu


Historia

Programista wdrożył mapowanie punktów użytkownika według zakresów, używając closed range, gdzie prawa granica była powyżej maksymalnej możliwej wartości. Prowadziło to do tego, że niektóre wartości trafiały od razu do dwóch przedziałów, a logika działała niepoprawnie.


Historia

W aplikacji użyto switch-case z zakresami, gdzie jedna z wartości nie weszła w żaden zakres z powodu niewłaściwego użycia operatora (na przykład 0...10 i 11...20 — a wartość 10.5 nigdzie nie trafiła). Błąd został odkryty dopiero na produkcji.


Historia

W kodzie usługi porównywano daty za pomocą matchowania zakresów, używając half-open range w sposób niepoprawny: końcowa data nie była włączona, co skutkowało odrzucaniem poprawnych przedziałów, prowadząc do niemożności zarezerwowania daty na ostatni dozwolony dzień.