ProgrammationDéveloppeur iOS

Expliquez la différence entre l'opérateur == et la méthode Equatable en Swift. Comment réaliser correctement la comparaison d'instances de types personnalisés ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

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 piège

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 }

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet.


Histoire

Dans un projet, un développeur a ajouté une propriété de type UIImage dans une structure déjà conforme à Equatable. Une erreur de compilation est survenue parce que UIImage n'implémente pas Equatable, 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).