En Swift, l'opérateur == est utilisé pour vérifier l'égalité de deux valeurs. Pour que cet opérateur puisse être utilisé avec des types personnalisés, le type doit conformer au protocole Equatable et implémenter la fonction statique ==.
L'implémentation doit être symétrique et transitive. Exemple :
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 } }
Il est à noter que si votre type n'implémente pas ==, une tentative de comparaison de deux de ces instances entraînera une erreur de compilation.
Question: Si une structure ou une classe hérite du protocole Equatable, pourquoi parfois l'opérateur == peut-il ne pas être implémenté explicitement ?
Réponse: Pour les structures dont toutes les propriétés correspondent également à Equatable, Swift synthétise automatiquement l'implémentation de l'opérateur ==. Cependant, si le type contient des propriétés qui ne sont pas Equatable, ou si le type est une classe avec héritage personnalisé, la synthèse ne se produira pas et il sera nécessaire d'implémenter l'opérateur manuellement.
struct Point: Equatable { var x: Int var y: Int // L'implémentation de == n'est pas nécessaire, elle est synthétisée automatiquement }
Histoire
Dans un projet, un développeur a ajouté une propriété de type
UIImagedans une structure déjà conforme àEquatable. Une erreur de compilation est survenue parce queUIImagen'implémente pasEquatable, donc la synthèse de==n'était pas possible pour la structure. La solution consiste à implémenter l'opérateur==manuellement, en comparant uniquement les propriétés essentielles pour la logique.
Histoire
Une erreur est survenue après l'ajout d'une nouvelle propriété dans la structure, mais en oubliant d'ajouter sa comparaison dans l'opérateur
==personnalisé. Cela a conduit à une logique incorrecte lors de l'utilisation des collections et à des bugs dans le filtre personnalisé.
Histoire
Un custom-classe a été écrite sans implémentation de
Equatable, mais elle a été tentée d'être utilisée dans un Set. Cela a entraîné une erreur d'exécution, car Set exige que les éléments soient uniques (et, par conséquent,Equatable).