ProgrammazioneSviluppatore Swift

Come funziona il pattern matching per i range in Swift e quali caratteristiche bisogna considerare quando si implementa il confronto con switch?

Supera i colloqui con l'assistente IA Hintsage

Risposta

In Swift, il range matching è spesso utilizzato in switch-case per confrontare i valori con i range. Per questo si utilizzano gli operatori ..< (half-open range) e ... (closed range):

let score = 76 switch score { case 0..<60: print("Insufficiente") case 60..<80: print("Sufficiente") case 80...100: print("Ottimo") default: print("Valore non valido") }

Caratteristiche:

  • I range devono essere crescenti: dal più piccolo al più grande (altrimenti il range sarà vuoto).
  • Il matching avrà successo se il valore rientra nel range.
  • Poiché i range sono strutture, possono essere utilizzati per il matching con qualsiasi tipo Comparable.

Domanda trabocchetto

Cosa succede se si utilizza un range con un limite superiore che non include il valore (ad esempio, 0..<5), e la variabile è uguale a 5?

Molti rispondono che quel case funzionerà, ma non è corretto: l'operatore ..< non include il limite superiore. Esempio:

let value = 5 switch value { case 0..<5: print("0-4") case 5: print("cinque") default: print("altro") } // Mostrerà: "cinque"

Esempi di errori reali a causa della mancata conoscenza delle sfumature dell'argomento


Storia

Un sviluppatore ha implementato la visualizzazione dei punteggi degli utenti per range, utilizzando un closed range, dove il limite destro era superiore al valore massimo possibile. Questo portava alcuni valori a cadere in due intervalli, causando un'errata logica.


Storia

Nell'app, veniva utilizzato switch-case con range, dove uno dei valori non rientrava in nessun range a causa di un uso errato dell'operatore (ad esempio, 0...10 e 11...20 — ma il valore 10.5 non rientrava). Il bug è stato scoperto solo in produzione.


Storia

Nel codice del servizio sono state confrontate date tramite range matching, utilizzando in modo errato il half-open range: la data finale non era inclusa, portando all'esclusione di intervalli validi, e rendendo impossibile la prenotazione della data nell'ultimo giorno consentito.