ProgrammatieiOS ontwikkelaar

Leg het verschil uit tussen de operator == en de Equatable-methode in Swift. Hoe kun je de vergelijking van instanties van eigen types correct implementeren?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

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 met een val

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 }

Voorbeelden van echte fouten door onwetendheid over de nuances van het onderwerp.


Verhaal

In een project voegde een ontwikkelaar een property van het type UIImage toe aan een struct die al aan Equatable voldeed. Een compilatiefout trad op omdat UIImage Equatable niet 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 Equatable implementatie, maar deze werd geprobeerd te gebruiken in een Set. Dit leidde tot een runtime-fout, omdat Set vereist dat de elementen uniek zijn (en dus Equatable).