some View — wat is het, het ondoorzichtige type in SwiftUI

Auteur: IT Sectr Gepubliceerd: 2026-06-24 Leestijd: 8 min

some View — de belangrijkste syntaxconstructie van Swift, zonder welke SwiftUI-werk onmogelijk is. Volgens Apple Swift Book, 2024, is some View een ondoorzichtig type (opaque type) dat het concrete type van de retourwaarde verbergt, terwijl het strikte typering tijdens compilatie behoudt. Deze constructie stelt het View-protocol in staat om een uniforme body-handtekening te hebben zonder implementatiedetails prijs te geven.

Belangrijkste punten

  • some View — het ondoorzichtige type geretourneerd door de body-eigenschap van het View-protocol
  • Omgekeerde generics — het concrete type wordt door de compiler vastgesteld, maar verborgen voor de aanroepende code
  • Prestaties — some View voegt geen overhead toe in tegenstelling tot AnyView
  • Beperking — alle retourpaden moeten hetzelfde concrete type hebben
  • @ViewBuilder lost het probleem van verschillende typen op via ConditionalContent

Wat is some View in SwiftUI?

some View — is de syntax van het ondoorzichtige type (opaque type), geïntroduceerd in Swift 5.1. Het wordt gebruikt als het returntype van de body-eigenschap van het View-protocol. De notatie some View betekent: „de functie of eigenschap retourneert een concreet type dat voldoet aan het View-protocol, maar de aanroepende code weet niet en hoeft niet te weten welk type precies”.

Het concept van het ondoorzichtige type is de keerzijde van generisch programmeren (generics). Terwijl generics de aanroepende code in staat stellen het type te bepalen, stelt opaque type de implementatie in staat het type te bepalen, het verbergend voor de aanroeper. Dit geeft de ontwikkelaar de vrijheid om de interne implementatie te wijzigen zonder het contract te veranderen.

Volgens Swift Evolution SE-0244 zijn opaque types toegevoegd ter ondersteuning van SwiftUI en het patroon van protocollen met geassocieerde typen (PAT), die zonder deze constructie niet als returntype kunnen worden gebruikt.

Waarom is some View nodig

Zonder some View zou de body-handtekening onmogelijk zijn: het View-protocol heeft een geassocieerd type Body dat voldoet aan View. Als body gewoon View (als protocol) zou retourneren, zou Swift niet kunnen werken met protocollen met Self requirements in de retourpositie. some View lost dit probleem op door een concreet maar verborgen type te bieden.

Ondoorzichtig type: werkingsmechanisme

Ondoorzichtig type (opaque type) — is een speciaal soort type dat zich gedraagt als concreet voor de compiler, maar als abstract voor de ontwikkelaar. Wanneer de compiler some View ziet, analyseert hij de implementatie en bepaalt het exacte returntype. Dit type wordt vastgesteld en gebruikt voor codegeneratie zonder dynamische dispatch.

swift
struct SimpleView: View {
    var body: some View {
        Text("Hallo")
    }
}
// Compiler ziet: body -> Text, niet some View

Werkingsprincipe: De Swift-compiler leidt het concrete type af uit de implementatie. In het bovenstaande voorbeeld bevat de body alleen Text, dus de compiler weet dat body precies Text retourneert, hoewel de handtekening is geschreven als some View. Dit biedt twee optimalisaties: directe aanroep zonder virtuele methodetabel en de mogelijkheid van inlining.

Als de body-implementatie verandert (bijvoorbeeld in plaats van Text wordt een VStack met Text en Button geretourneerd), bepaalt de compiler het concrete type opnieuw. Maar voor de aanroepende code (SwiftUI) blijft de handtekening hetzelfde — some View. Dit is de keerzijde van generics: de aanroepende code is niet afhankelijk van implementatiewijzigingen.

Typevaststelling en stabiliteit

Een van de belangrijkste regels van opaque type: een functie of eigenschap die some View retourneert, moet altijd hetzelfde concrete type retourneren. Je kunt niet in de ene if-tak Text retourneren en in de andere Image. Deze beperking wordt door de compiler gecontroleerd en is een garantie voor de aanroepende code.

swift
struct BadView: View {
    var flag: Bool
    var body: some View {
        if flag {
            Text("Waar")   // Fout: Text vs VStack
        } else {
            VStack {
                Text("Onwaar")
                Image(systemName: "xmark")
            }
        }
    }
}

Om dit probleem op te lossen wordt @ViewBuilder gebruikt, die verschillende takken in een conditionele container ConditionalContent wikkelt. De @ViewBuilder-annotatie boven body — standaardpraktijk in SwiftUI, hoewel deze impliciet kan zijn als body slechts één expressie bevat.

some View vs AnyView: vergelijking

AnyView — is een type dat de concrete View-implementatie wist (type erasure). Het wikkelt elke View in een uniforme wrapper, waardoor Views van verschillende typen in één container kunnen worden opgeslagen. In tegenstelling tot some View werkt AnyView tijdens runtime en voegt overhead toe voor in- en uitpakken.

Criteriumsome ViewAnyView
Oplossingstijdcompilatieuitvoering
Prestatiesdirecte aanroep, geen overheadverpakking in existential container
Typeflexibiliteitéén concreet typeelk View-type
Dynamische wijzigingniet ondersteundondersteund in runtime
Gebruiksprioriteitaltijd wanneer mogelijkalleen wanneer some View niet mogelijk is
PAT-protocolondersteuningjaja

Wanneer AnyView gebruiken: alleen in situaties waar some View niet mogelijk is vanwege de vereiste van dynamische typewijziging tijdens runtime. Bijvoorbeeld bij het retourneren van een View uit een woordenboek of bij een recursieve structuur waar het concrete type op elk niveau moet veranderen. AnyView moet worden geminimaliseerd omdat elke verpakking SwiftUI-optimalisaties uitschakelt.

Verkeerde opvatting: AnyView lost het probleem van verschillende typen in body niet op — dit probleem lost @ViewBuilder op. AnyView wist het type, maar helpt de compiler niet om een uniform type af te leiden. Gebruik @ViewBuilder voor conditionele logica en AnyView alleen voor dynamische dispatch.

some View en @ViewBuilder: samenwerking

@ViewBuilder — is een result builder, speciaal gemaakt voor het werken met some View. Het maakt het gebruik van conditionele logica (if/else, switch) en meerdere expressies in de body mogelijk, terwijl een uniform returntype behouden blijft. ViewBuilder wikkelt automatisch meerdere expressies in TupleView en conditionele takken in ConditionalContent.

swift
struct ProfileView: View {
    let user: User?

    @ViewBuilder
    var body: some View {
        if let user {
            UserCard(user: user)
            Text("Online")
                .font(.caption)
        } else {
            ProgressView("Loading...")
        }
    }
}

Hoe het werkt: @ViewBuilder analyseert het codeblok en genereert de overeenkomstige aanroep van buildBlock, buildOptional of buildEither. Voor conditionele logica wordt ConditionalContent gemaakt — een gemeenschappelijk type dat de concrete typen in de takken verbergt, maar zelf een uniform type is voor de compiler. Dit lost het probleem van verschillende concrete typen op.

Zonder @ViewBuilder zou de body-eigenschap met meerdere expressies of conditionele logica een compilatiefout veroorzaken. Daarom past SwiftUI @ViewBuilder impliciet toe op body, en voor aangepaste eigenschappen en functies moet het expliciet worden toegevoegd.

Nesting van @ViewBuilder

@ViewBuilder kan worden genest: de ene ViewBuilder binnen de andere. Dit maakt het mogelijk om complexe hiërarchieën te creëren met voorwaarden op verschillende niveaus. Diepe nesting bemoeilijkt echter de leesbaarheid, dus wordt aanbevolen om geneste voorwaarden naar aparte View-componenten te verplaatsen.

Praktische voorbeelden van some View

Voorbeeld 1: het retourneren van een aangepaste View uit een berekende eigenschap. De eigenschap kan some View retourneren, waarbij de interne compositie verborgen blijft. Dit maakt het mogelijk om code te reorganiseren zonder de openbare interface te wijzigen.

swift
struct ArticleView: View {
    var body: some View {
        CardView {
            HeaderView()
            ContentView()
            FooterView()
        }
    }
}

struct CardView<Content: View>: View {
    let content: Content

    var body: some View {
        content
            .padding(16)
            .background(.white)
            .cornerRadius(12)
            .shadow(radius: 4)
    }
}

Voorbeeld 2: het doorgeven van een View als een closure via @ViewBuilder. Dit patroon wordt gebruikt in standaard SwiftUI-containers (VStack, HStack, List) en kan worden geïmplementeerd in aangepaste componenten.

swift
struct CustomContainer<Content: View>: View {
    @ViewBuilder let content: () -> Content

    var body: some View {
        VStack(alignment: .leading) {
            content()
        }
        .padding(20)
    }
}

Voorbeeld 3: een fabrieksfunctie die some View retourneert. Maakt het mogelijk om Views te maken op basis van parameters zonder de implementatie prijs te geven. Dit is vooral handig voor bibliotheken en herbruikbare componenten.

swift
func makeIcon(for status: Status) -> some View {
    switch status {
    case .success:
        Image(systemName: "checkmark.circle.fill")
            .foregroundColor(.green)
    case .error:
        Image(systemName: "xmark.circle.fill")
            .foregroundColor(.red)
    case .pending:
        ProgressView()
    }
}

Veelgestelde vragen

Wat betekent some View in SwiftUI?

some View — een ondoorzichtig type (opaque type), wat betekent dat er een concreet type wordt geretourneerd dat voldoet aan het View-protocol. Het concrete type wordt door de compiler vastgesteld, maar is verborgen voor de aanroepende code. Dit zorgt voor strikte typering zonder implementatiedetails prijs te geven.

Wat is het verschil tussen some View en AnyView?

some View wordt tijdens compilatie opgelost met nul overhead. AnyView gebruikt type erasure tijdens runtime met extra kosten voor verpakking in een existential container. Gebruik some View altijd wanneer mogelijk, AnyView — alleen voor dynamische typewijziging.

Waarom kan some View niet worden gebruikt met verschillende typen in if/else?

Het ondoorzichtige type vereist één enkel concreet type voor alle retourpaden. if/else met verschillende typen schendt deze vereiste. @ViewBuilder lost het probleem op door takken in ConditionalContent te wikkelen — een uniform type dat de verschillen van concrete implementaties verbergt.

Hoe beïnvloedt some View de prestaties van SwiftUI?

some View vermindert de prestaties niet — de compiler kent het exacte type en genereert directe code. Daarentegen zou any View (als protocol) dynamische dispatch vereisen. some View — is een optimalisatiemechanisme ingebouwd in het ontwerp van SwiftUI.

Kan some View buiten SwiftUI worden gebruikt?

Ja, some — is een algemene Swift 5.1-constructie, niet gebonden aan SwiftUI. Het kan met elk protocol worden gebruikt: some Equatable, some Codable, some Collection. Dit is handig voor het verbergen van complexe geneste typen zoals [String: [Int]].

Samenvatting

  • some View — het ondoorzichtige Swift-type geretourneerd door de body-eigenschap van het View-protocol
  • Opaque type — de keerzijde van generics: de implementatie bepaalt het type, het verbergend voor de aanroeper
  • Compiler stelt het concrete type tijdens compilatie vast voor code-optimalisatie
  • @ViewBuilder lost het probleem van verschillende typen op via ConditionalContent
  • AnyView — type erasure met overhead, gebruik alleen wanneer some View niet mogelijk is
  • One-type rule — alle retourpaden van some View moeten hetzelfde concrete type hebben
  • some — algemene Swift-constructie, toepasbaar op elk protocol, niet alleen View

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.

Bespreek het project

Lees ook