Il pattern matching è una parte fondamentale del linguaggio Swift, che consente di gestire in modo sicuro ed elegante diverse varianti di enum. Questo approccio proviene dai linguaggi funzionali, dove il pattern matching consente di elaborare in modo compatto diversi casi, evitando catene lunghe di if-else. In Swift, il pattern matching per enum viene realizzato principalmente con lo switch, dove ogni case viene trattato singolarmente.
Si presenta un problema quando non vengono gestiti tutti i casi, o quando viene scelto un default che potenzialmente "nasconde" i casi non considerati. Ciò può portare a errori di runtime quando si aggiungono nuovi casi all'enumerazione.
La soluzione è quella di enumerare esplicitamente tutte le varianti dell'enumerazione nello switch, evitando default (se possibile). Questo approccio garantisce che quando l'enumerazione viene modificata, il compilatore non ignori i casi non gestiti.
Esempio di codice:
enum NetworkStatus { case connected case disconnected case connecting } func handle(status: NetworkStatus) { switch status { case .connected: print("Rete connessa") case .disconnected: print("Rete disconnessa") case .connecting: print("Connessione...") } }
Caratteristiche chiave:
1. È possibile utilizzare espressioni if case per enum senza associated values?
Sì, è possibile. Questo consente di verificare brevemente un caso specifico.
if case .connected = status { print("Rete connessa") }
2. È necessario implementare default se tutti i case sono utilizzati nello switch?
No, se tutte le varianti sono implementate, il default non è richiesto. È meglio evitare il default — in questo modo il compilatore segnalerà l'aggiunta di nuovi case.
3. È possibile utilizzare fallthrough all'interno dello switch con enum?
Sì, è possibile, ma altamente sconsigliato, poiché il fallthrough non tiene conto della semantica del case e può portare a errori logici.
Nell'enum NetworkStatus è stato aggiunto un nuovo case .noSignal, ma nel switch esistente è presente un default, quindi l'errore viene scoperto solo a runtime, quando lo stato non viene gestito correttamente.
Pro:
Contro:
Tutti i case sono gestiti esplicitamente. Il compilatore avvisa della necessità di aggiornare lo switch subito dopo l'aggiunta di un nuovo case.
Pro:
Contro: