In Swift wordt de operator == gebruikt om de gelijkheid van twee waarden te controleren. Om deze operator met gebruikersgedefinieerde types te kunnen gebruiken, moet het type voldoen aan het Equatable-protocol en een statische functie == implementeren.
De implementatie moet symmetrisch en transitief zijn. Voorbeeld:
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 } }
Houd er rekening mee dat als jouw type == niet implementeert, een poging om twee van dergelijke instanties te vergelijken zal resulteren in een compilatiefout.
Vraag: Als een struct of class het Equatable-protocol erft, waarom is het soms niet nodig om de operator == expliciet te implementeren?
Antwoord: Voor structs waarvan alle properties ook voldoen aan Equatable, genereert Swift automatisch een implementatie van de operator ==. Maar als het type properties heeft die niet Equatable zijn, of als het type een class is met aangepaste overerving, zal de synthese niet plaatsvinden en moet de operator handmatig geïmplementeerd worden.
struct Point: Equatable { var x: Int var y: Int // Implementatie van == is niet nodig, het wordt automatisch gesynthetiseerd }
Verhaal
In een project voegde een ontwikkelaar een property van het type
UIImagetoe aan een struct die al aanEquatablevoldeed. Een compilatiefout trad op omdatUIImageEquatableniet implementeert, en daarom kon==niet automatisch voor de struct worden gesynthetiseerd. Oplossing — de operator==handmatig implementeren door alleen de essentiële properties voor de logica te vergelijken.
Verhaal
Een fout trad op nadat een nieuwe property aan de struct was toegevoegd, maar de vergelijking in de gebruikersgedefinieerde operator
==was vergeten. Dit leidde tot onjuiste logica bij het werken met collecties en bugs in de gebruikersfilter.
Verhaal
In een project was er een custom-class geschreven zonder
Equatableimplementatie, maar deze werd geprobeerd te gebruiken in een Set. Dit leidde tot een runtime-fout, omdat Set vereist dat de elementen uniek zijn (en dusEquatable).