In Swift, l'operatore == viene utilizzato per controllare l'uguaglianza tra due valori. Per poter utilizzare questo operatore con tipi personalizzati, il tipo deve conformarsi al protocollo Equatable e implementare la funzione statica ==.
L'implementazione deve essere simmetrica e transitiva. Ecco un esempio:
struct Person: Equatable { let name: String let age: Int static func ==(lhs: Person, rhs: Person) -> Bool { return lhs.name == rhs.name && lhs.age == rhs.age } }
È importante ricordare che se il tuo tipo non implementa ==, il tentativo di confronto tra due istanze di quel tipo porterà a un errore di compilazione.
Domanda: Se una struttura o una classe eredita il protocollo Equatable, perché a volte l'operatore == può non essere implementato esplicitamente?
Risposta: Per le strutture, tutte le proprietà delle quali sono anch'esse conformi a Equatable, Swift sintetizza automaticamente l'implementazione dell'operatore ==. Ma se il tipo ha proprietà che non sono Equatable, o se il tipo è una classe con ereditarietà personalizzata, la sintesi non avverrà e sarà necessario implementare l'operatore manualmente.
struct Point: Equatable { var x: Int var y: Int // L'implementazione di == non è necessaria, viene sintetizzata automaticamente }
Storia
In un progetto, uno sviluppatore ha aggiunto una proprietà di tipo
UIImagea una struttura già conforme aEquatable. È comparso un errore di compilazione perchéUIImagenon implementaEquatable, quindi non era possibile sintetizzare automaticamente==per la struttura. La soluzione è stata implementare manualmente l'operatore==, confrontando solo le proprietà significative per la logica.
Storia
Si è verificato un errore dopo l'aggiunta di una nuova proprietà alla struttura, ma si è dimenticato di aggiungere il suo confronto all'operatore
==personalizzato. Questo ha portato a una logica errata durante l'elaborazione delle collezioni e a bug nel filtro personalizzato.
Storia
In un progetto è stata scritta una classe personalizzata senza implementazione di
Equatable, ma è stata tentata di utilizzarla in un Set. Questo ha portato a un errore di runtime, poiché Set richiede che gli elementi siano unici (e quindiEquatable).