In Swift ligt de nadruk sterk op Protocol Oriented Programming (POP). Het belangrijkste idee van POP is om de architectuur te ontwerpen met protocollen (interfaces), in plaats van met basisklassen. Protocollen bieden flexibiliteit voor het erven van gedrag via meerdere ketens, waardoor de koppeling van de code wordt verminderd.
Swift staat protocollen toe om default-implementaties te hebben (via extensions), wat hergebruik van code bevordert zonder de noodzaak van klassenhiërarchieën. klassieke OOP vertrouwt op erfelijkheid tussen klassen, wat beperkt is tot één erfelijkheidketen. POP is vrij van deze beperkingen en staat compositie en uitbreidbaarheid toe.
Codevoorbeeld:
protocol Drivable { func drive() } extension Drivable { func drive() { print("Driving forward!") } } struct Car: Drivable {} let car = Car() car.drive() // Toont: Driving forward!
Kan je een stored property toevoegen in een protocol extension?
Antwoord: Nee, in protocol extensions kunnen geen opgeslagen (stored) eigenschappen worden toegevoegd, alleen berekende (computed) eigenschappen en methoden. Bijvoorbeeld,
// Fout! extension Drivable { var speed: Int = 0 // Compilatiefout: Extensions mogen geen opgeslagen eigenschappen bevatten }
Verhaal
In een groot project probeerden ontwikkelaars opgeslagen eigenschappen toe te voegen via protocol extensions voor het bijhouden van de status. De code compileerde met een fout, waardoor de architectuur halverwege de sprint opnieuw moest worden ontworpen om externe oplossingen met objc_get/setAssociatedObject te gebruiken — wat de leesbaarheid van de code verslechterde.
Verhaal
In het project was een basisklasse geïmplementeerd voor verschillende soorten entiteiten en werd meervoudige erfelijkheid via protocollen gebruikt. De ontwikkelaar verwarde het gedrag van de default-implementatie in de extension en probeerde deze methode in de struct te overschrijven, in de veronderstelling dat de specifieke implementatie in de struct zou worden aangeroepen. Uiteindelijk was het moeilijk om de volgorde van de methode-aanroepen te volgen.
Verhaal
Bij het schalen van de module werden protocollen gebruikt om verantwoordelijkheden te splitsen, maar door gebrek aan ervaring met POP zorgden de ontwikkelaars niet voor duidelijke afhankelijkheden tussen de protocollen. Dit leidde tot dubbele code en interfaceconflicten bij het samenvoegen van meerdere extensions in grote ontwikkelingsteams.