Swift Academy · Les

Existentials met any en type-erasure

any Protocol gebruiken, de prestatiekosten begrijpen en weten wanneer generics de voorkeur hebben.

Les 3 van 413 stappen

Existentials met any en type-erasure is een gratis Swift Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Swift Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Swift Academy bevat in totaal 4 lessen.

Wat is een existentieel type?

Een existentieel type verpakt elke waarde die aan een protocol voldoet achter een uniform koppelvlak en bepaalt dit tijdens de uitvoering.

protocol Drawable { func draw() }
struct Line: Drawable { func draw() { print("Line") } }
let d: any Drawable = Line()
d.draw()

Het sleutelwoord any

Swift 5.7 vereist het sleutelwoord any vóór protocolnamen die als existentiële typen worden gebruikt, zodat het verpakken expliciet is.

func render(_ shape: any Drawable) {
  shape.draw()
}
render(Line())

Kosten van existentiële typen

Existentiële typen gebruiken toewijzing op de heap en dynamische methodekeuze, wat trager kan zijn dan generics met statische methodekeuze.

// Existential – dynamic dispatch, potential heap alloc
var shapes: [any Drawable] = [Line(), Line()]
// Generic – static dispatch, no boxing
func drawGeneric<T: Drawable>(_ s: T) { s.draw() }

Probleem met PAT's en existentiële typen

Protocollen met geassocieerde typen (PAT's) kunnen zonder type-uitwissing niet als onverhulde existentiële typen worden gebruikt.

protocol Container { associatedtype Item }
// var c: any Container // Swift 5.7 allows with "any" but loses Item info

Patroon voor type-uitwissing

Een wrapper voor type-uitwissing verpakt een concreet type achter een struct, zodat het concrete type verborgen blijft.

struct AnyDrawable: Drawable {
  private let _draw: () -> Void
  init<D: Drawable>(_ d: D) { _draw = d.draw }
  func draw() { _draw() }
}

AnySequence en AnyPublisher

De standaardbibliotheek van Swift en Combine leveren wrappers voor type-uitwissing, zoals AnySequence en AnyPublisher.

import Combine
let subject = PassthroughSubject<Int, Never>()
let pub: AnyPublisher<Int, Never> = subject.eraseToAnyPublisher()

eraseToAnyPublisher()

eraseToAnyPublisher() verbergt de keten van concrete publishers, zodat aanroepers alleen afhankelijk zijn van AnyPublisher.

func fetch() -> AnyPublisher<String, Error> {
  URLSession.shared.dataTaskPublisher(for: URL(string: "https://example.com")!)
    .map { String(data: $0.data, encoding: .utf8) ?? "" }
    .eraseToAnyPublisher()
}

Wanneer existentiële typen geschikt zijn

Gebruik existentiële typen voor heterogene collecties of wanneer het exacte type tijdens het compileren onbekend is.

var widgets: [any Drawable] = [] // mixed concrete types OK

Geef de voorkeur aan generieke typen boven existentiële typen

Vervang existentiële typen waar mogelijk door generieke typen om statische dispatch en betere prestaties te verkrijgen.

// Prefer this:
func draw<T: Drawable>(_ item: T) { item.draw() }
// Over this:
func draw(_ item: any Drawable) { item.draw() }

Existentiële typen openen

Swift 5.7+ kan een existentiëel type automatisch "openen" bij het aanroepen van een generieke functie, waarbij het onderliggende type wordt geëxtraheerd.

func drawGeneric<T: Drawable>(_ d: T) { d.draw() }
let d: any Drawable = Line()
drawGeneric(d) // compiler opens the existential automatically

Type-uitwissing versus opake typen

Type-uitwissing verbergt het type voor heterogeen gebruik; opake typen behouden de identiteit voor één consistent retourtype.

let erased: any Drawable = Line()   // runtime type unknown
let opaque: some Drawable = Line()   // compile-time fixed type

Korte controle

Wat zijn de belangrijkste prestatiekosten van existentiële typen?

Samenvatting van de les

Existentiële typen (any Protocol) maken polymorfisme tijdens runtime mogelijk, ten koste van dynamische dispatch. Type-uitwissing verpakt concrete typen achter een stabiele interface. Geef voor betere prestaties de voorkeur aan generieke typen; gebruik existentiële typen voor heterogene collecties.

Gratis beginnen

Leer Swift met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
122
Lessen
409

Veelgestelde vragen

Is de les “Existentials met any en type-erasure” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad Swift Academy, waaronder “Existentials met any en type-erasure”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Swift Academy bevat in totaal 4 lessen.

Wat leer ik in “Existentials met any en type-erasure”?

any Protocol gebruiken, de prestatiekosten begrijpen en weten wanneer generics de voorkeur hebben. Je oefent met Swift Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Swift Academy te beginnen?

Ervaring vooraf is niet nodig. Swift Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.

Hoe lang duurt de les “Existentials met any en type-erasure”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Swift Academy?

Ja. Elke les over Swift Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Generieke beperkingen en where-clausules
  2. Opaque types met het some-sleutelwoord
  3. Existentials met any en type-erasure
  4. Primaire associated types en getypeerde throws
← Terug naar Swift Academy