Protocol in Swift — is een contract dat een reeks vereisten definieert waaraan elk type dat het accepteert moet voldoen. Protocollen vormen de basis van protocol-georiënteerd programmeren (POP) — een paradigma dat door Apple wordt aanbevolen voor Swift naast klassiek OOP. Volgens Apple Documentation, 2026 kunnen structuren, klassen en enum protocollen accepteren, wat de architectuur flexibel en testbaar maakt.
Belangrijkste punten
Protocol — is een abstracte interface die bepaalt wat een type moet kunnen, maar niet hoe het dat doet. In Swift is het protocol het equivalent van interfaces in Java of Go, maar met extra mogelijkheden.
Een protocol kan vereisen:
{ get } of { get set }Volgens WWDC 2015 introduceerde Apple Protocol-Oriented Programming als een fundamentele benadering voor de architectuur van Swift-applicaties. In tegenstelling tot OOP, waar klasse-overerving starre hiërarchieën creëert, stelt POP compositie van protocollen voor. Dit biedt flexibiliteit: één type kan aan meerdere protocollen voldoen en de vereisten en implementaties via extensions ontvangen.
Protocol wordt gedeclareerd met het trefwoord protocol met een naam en body.
protocol Drawable {
func draw(context: CGContext)
var boundingBox: CGRect { get }
}
Een type accepteert een protocol via een dubbele punt na de naam:
struct Circle: Drawable {
let center: CGPoint
let radius: CGFloat
func draw(context: CGContext) {
context.addArc(center: center, radius: radius, ...)
}
var boundingBox: CGRect {
CGRect(x: center.x - radius, y: center.y - radius,
width: radius * 2, height: radius * 2)
}
}
Eén type kan meerdere protocollen accepteren, gescheiden door komma's: struct MyType: ProtocolA, ProtocolB. De compiler controleert of aan alle vereisten van elk protocol is voldaan.
Property requirements worden gespecificeerd met het trefwoord var en toegangsspecificaties { get } of { get set }.
protocol UserProtocol {
var name: String { get }
var age: Int { get set }
static var maxAge: Int { get }
mutating func updateName(_ newName: String)
}
Het trefwoord mutating in een protocol betekent dat de methode self kan wijzigen. Structuren moeten zo'n methode als mutating implementeren, klassen kunnen dit weglaten. Method requirements worden gespecificeerd met volledige handtekening inclusief parameterlabels.
Protocol kan een ander protocol erven en nieuwe vereisten toevoegen. Dit creëert een hiërarchie van contracten zonder starre koppeling aan klassen.
protocol Vehicle {
var speed: Double { get set }
func move()
}
protocol Flyable: Vehicle {
var altitude: Double { get set }
func takeOff()
}
Een type dat Flyable accepteert, moet voldoen aan de vereisten van beide protocollen — zowel Vehicle als Flyable. Swift ondersteunt meervoudige overerving van protocollen: protocol A: B, C.
Protocol Composition — een mechanisme waarmee kan worden gespecificeerd dat een type tegelijkertijd aan meerdere protocollen moet voldoen, zonder een nieuw combinatieprotocol te maken.
func render(_ item: Drawable & Animatable) {
item.draw(context: ...)
item.animate(duration: 0.3)
}
Composition (&) werkt in functieparameters, variabelen en generieke beperkingen. De compiler controleert of het doorgegeven type tegelijkertijd aan alle protocollen voldoet. Composition wordt vaak gebruikt in SwiftUI: some View — is een generiek met composition.
Protocol Composition heeft de voorkeur boven het creëren van een overervingshiërarchie: in plaats van protocol A: B, C kan direct B & C worden geaccepteerd. Dit biedt flexibiliteit en vermindert koppeling. Composition is vooral handig in functieparameters en generieke beperkingen, waar tijdelijk vereisten moeten worden gecombineerd zonder een tussenliggend protocol te creëren. Dit vermindert het aantal hulptypen in de code.
Protocol kan worden gebruikt als type van een variabele, functieparameter of collectie-element. Dit wordt een existential type genoemd.
var drawableItem: Drawable
let items: [Drawable] = [Circle(...), Rectangle(...)]
func process(drawables: [any Drawable]) {
for item in drawables {
item.draw(context: ...)
}
}
Het trefwoord any (Swift 5.6+) geeft expliciet existential aan. Zonder any geeft de compiler een waarschuwing. Swift ondersteunt ook some (opaque types) om het concrete type achter een protocol te verbergen — dit is de standaardtechniek in SwiftUI.
Bij het werken met protocol maken ontwikkelaars vaak een aantal terugkerende fouten.
Drawable in plaats van <T: Drawable> waar een concreet type nodig isAnyObject zonder noodzaak, wat struct en enum uitsluitVeelgestelde vragen
Protocol definieert alleen vereisten zonder implementatie (tot protocol extensions). Abstract class kan implementatie en toestand bevatten. In Swift zijn er geen abstracte klassen — hun rol wordt vervuld door protocollen met extensions.
Ja, structuren, klassen en enum — allemaal kunnen ze protocollen accepteren. Dit is de basis van POP: u hoeft geen klassen te gebruiken voor architectuurorganisatie. Structuren met protocollen bieden waardesemantiek en onveranderlijkheid.
Associated type (associatedtype) — een placeholder voor het type dat het implementerende type zelf bepaalt. Voorbeeld: Collection heeft associatedtype Element. Dit is een generiek op protocolniveau.
Ja, voeg overerving van AnyObject toe: protocol MyProtocol: AnyObject. Dan kunnen alleen klassen dit protocol accepteren. Dit is handig voor weak-referenties en delegaten.
Gebruik is voor controle en as? voor conversie: if let drawable = item as? Drawable. Dit werkt alleen voor protocollen zonder associated types.
Samenvatting
&) combineert protocollen zonder overervingany) en opaque types (some) — twee manieren om met protocollen te werkenWe ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook