Extension in Swift is een mechanisme waarmee nieuwe functionaliteit aan bestaande typen kan worden toegevoegd zonder de broncode ervan te wijzigen. Extensies ondersteunen methoden, berekende eigenschappen, initializers, subscripts, geneste typen en de implementatie van protocollen. Volgens Apple Documentation, 2026 zijn extensies een belangrijk hulpmiddel voor het organiseren van code en het naleven van het Open/Closed-principe in Swift-projecten.
Belangrijkste punten
Extension in Swift is een taalconstructie waarmee een bestaand type (klasse, structuur, enum, protocol) kan worden uitgebreid met nieuwe mogelijkheden. Het is een analoog van categorieën in Objective-C, maar met meer mogelijkheden.
Extension kan toevoegen:
Volgens Apple-documentatie kan extension bestaande methoden (dynamic dispatch) niet overschrijven en kan het geen stored properties toevoegen. Deze beperkingen behouden de integriteit van het oorspronkelijke type.
Extension wordt gedeclareerd met het trefwoord extension met vermelding van het uit te breiden type.
extension Double {
var km: Double { return self * 1000.0 }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1000.0 }
}
let distance = 5.0.km
print("5 km = \(distance) meter") // 5000.0
U kunt niet alleen uw eigen typen uitbreiden, maar ook de typen van de standaardbibliotheek van Swift, Foundation, UIKit en andere frameworks. Dit maakt extension een krachtig hulpmiddel voor het toevoegen van domeinspecifieke functionaliteit.
Extension maakt het mogelijk om instantie- en typemethoden aan elk bestaand type toe te voegen.
extension String {
func isValidEmail() -> Bool {
let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
return self.range(of: emailRegex, options: .regularExpression) != nil
}
static func random(length: Int) -> String {
let letters = "abcdefghijklmnopqrstuvwxyz0123456789"
return String((0..<length).map { _ in letters.randomElement()! })
}
}
let email = "user@example.com"
print(email.isValidEmail()) // true
let code = String.random(length: 8) // "a3f8k2m1"
Muteren methoden breiden waardetypen (struct, enum) uit en kunnen self wijzigen. Voor klassen is muteren niet vereist. Extension kan muteren methoden toevoegen, zelfs aan typen van de standaardbibliotheek.
Extension kan alleen berekende eigenschappen toevoegen — stored properties zijn verboden. Dit is logisch: extension beheert het geheugen van het oorspronkelijke type niet.
extension Date {
var isPast: Bool {
return self < Date()
}
var isToday: Bool {
return Calendar.current.isDateInToday(self)
}
}
let someDate = Date().addingTimeInterval(3600)
print(someDate.isPast) // false (een uur vanaf nu is toekomst)
Computed properties in extension zijn onderworpen aan dezelfde regels als in de hoofdimplementatie: { get } en { get set } eigenschappen kunnen worden gemaakt. Swift legt geen beperkingen op aan het aantal extensions voor één type. U kunt zoveel extensions voor één type in verschillende bestanden declareren als u wilt — dit is standaardpraktijk in grote projecten.
Extension is de voorkeursmethode voor het implementeren van protocollen. In plaats van de hoofddeclaratie van het type te vervuilen, worden alle methoden van het protocol in een aparte extension geplaatst.
struct User {
let id: Int
let name: String
let email: String
}
// Extension per protocol — schone scheiding
extension User: Equatable {
static func == (lhs: User, rhs: User) -> Bool {
return lhs.id == rhs.id
}
}
extension User: Codable {
enum CodingKeys: String, CodingKey {
case id, name, email
}
}
Deze benadering scheidt verantwoordelijkheden: de hoofdstructuur bevat alleen stored properties, extensions — de implementatie van protocollen. Swift staat zelfs implementatie van een protocol via extension toe voor typen die we niet beheersen.
Extension is niet alleen een taalfaciliteit, maar een hulpmiddel voor architecturale organisatie. Correct gebruik van extensions maakt code leesbaar en onderhoudbaar.
// MARK: - Equatable voor navigatieprivate// MARK: - User + Displayable
extension User: Displayable {
var displayName: String {
return "\(name) (\(email))"
}
}
Volgens de Swift API Design Guidelines verbeteren extensions de leesbaarheid: de ontwikkelaar ziet de gegevensstructuur in de hoofddeclaratie en de logica in de extensions. Dit komt overeen met het principe van interfacescheiding (Interface Segregation).
Extension met where-beperkingen voegt methoden alleen toe voor specifieke typen: extension Array where Element: Equatable { func isUnique() -> Bool }. Zulke code is beknopt en typeveilig — de methode isUnique verschijnt alleen in arrays met Equatable-elementen, waardoor fouten in de compilatiefase worden geëlimineerd en de API schoner, veiliger en begrijpelijker wordt voor andere ontwikkelaars.
Veelgestelde vragen
Nee, extension kan geen stored properties toevoegen. Deze beperking is fundamenteel: extension neemt niet deel aan geheugentoewijzing voor de instantie van het type. Gebruik voor stored properties de hoofddeclaratie van het type.
Nee, extension kan methoden niet overschrijven. Een poging om een methode met dezelfde handtekening als een bestaande te declareren, leidt tot een compilatiefout. Gebruik voor overschrijven klasseovererving.
Extension voegt functionaliteit toe zonder een nieuw type te creëren. Subclassing creëert een hiërarchie en ondersteunt overschrijven. Extension vereist geen toegang tot de broncode en werkt met alle typen.
Ja, extension kan generic zijn als het uitgebreide type generic is: extension Array where Element: Numeric. Ook kunnen generic methoden met eigen typeparameters binnen een extension worden toegevoegd.
Extension heeft geen invloed op de prestaties — extension-methoden worden gecompileerd als gewone methoden. Voor protocollen met extension wordt static dispatch gebruikt, wat sneller kan zijn dan dynamic dispatch van klassen.
Samenvatting
We 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