ProgrammazioneSviluppatore iOS

Spiega la differenza tra l'operatore == e il metodo Equatable in Swift. Come implementare correttamente il confronto tra le istanze di tipi propri?

Supera i colloqui con l'assistente IA Hintsage

Risposta

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 trabocchetto

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 }

Esempi di reali errori dovuti alla mancanza di conoscenza delle sottigliezze dell'argomento.


Storia

In un progetto, uno sviluppatore ha aggiunto una proprietà di tipo UIImage a una struttura già conforme a Equatable. È comparso un errore di compilazione perché UIImage non implementa Equatable, 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 quindi Equatable).