Swift Academy · Les

Lagen: domein, data en presentatie

Bedrijfslogica scheiden van gegevenstoegang en UI in een Swift-app.

Les 1 van 413 stappen

Lagen: domein, data en presentatie is een gratis Swift Academy-les op CoddyKit. Dit is les 1 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.

Schone architectuur in Swift

Schone architectuur verdeelt code in lagen: Domein (bedrijfslogica), Data (persistentie en netwerk) en Presentatie (UI).

// Domain: pure Swift, no framework imports
// Data: Core Data / URLSession / JSON
// Presentation: SwiftUI / UIKit

De domeinlaag

De domeinlaag bevat bedrijfsentiteiten, gebruiksscenario's en repositoryprotocollen. Deze laag heeft geen afhankelijkheden van UIKit, SwiftUI of databases.

// Domain/Entities/User.swift
struct User {
  let id: Int
  var name: String
  var email: String
}
// No import UIKit, no import SwiftData

Gebruiksscenario's in het domein

Een gebruiksscenario kapselt één specifieke bedrijfsbewerking in. Het is alleen afhankelijk van repositoryprotocollen uit het domein.

// Domain/UseCases/FetchUserUseCase.swift
struct FetchUserUseCase {
  let repo: UserRepository
  func execute(id: Int) async throws -> User {
    try await repo.getUser(id: id)
  }
}

Repositoryprotocollen in het domein

Repositoryprotocollen definiëren het contract voor gegevenstoegang. Het domein beheert het protocol; de datalaag levert de implementatie.

// Domain/Repositories/UserRepository.swift
protocol UserRepository {
  func getUser(id: Int) async throws -> User
  func saveUser(_ user: User) async throws
}

De datalaag

De datalaag implementeert domeinprotocollen met concrete technologieën (URLSession, Core Data, SwiftData, Keychain).

// Data/Repositories/RemoteUserRepository.swift
struct RemoteUserRepository: UserRepository {
  func getUser(id: Int) async throws -> User {
    let data = try await URLSession.shared.data(from: userURL(id)).0
    return try JSONDecoder().decode(User.self, from: data)
  }
  func saveUser(_ user: User) async throws { /* PUT request */ }
}

Objecten voor gegevensoverdracht

DTO's zijn Codable-typen die in de datalaag worden gebruikt om API-antwoorden te decoderen en vervolgens aan domeinentiteiten worden gekoppeld.

struct UserDTO: Decodable {
  var user_id: Int
  var full_name: String
  func toDomain() -> User { User(id: user_id, name: full_name, email: "") }
}

De presentatielaag

De presentatielaag bevat ViewModels en SwiftUI-weergaven. Deze laag roept gebruiksscenario's aan en stelt waarneembare toestand beschikbaar.

// Presentation/ViewModels/ProfileViewModel.swift
@MainActor
final class ProfileViewModel: ObservableObject {
  @Published var user: User?
  private let useCase: FetchUserUseCase
  init(useCase: FetchUserUseCase) { self.useCase = useCase }
  func load(id: Int) async {
    user = try? await useCase.execute(id: id)
  }
}

Richting van afhankelijkheden

Afhankelijkheden wijzen naar binnen: de presentatielaag is afhankelijk van het domein; de datalaag is afhankelijk van het domein. Het domein is nergens van afhankelijk.

// Outer → Inner dependency rule:
Presentation → Domain ← Data
// Domain is the stable core; outer layers are swappable

Mappenstructuur

Organiseer Swift-bestanden in grote apps eerst per laag en daarna per functie.

// MyApp/
// ├── Domain/
// │   ├── Entities/
// │   ├── UseCases/
// │   └── Repositories/  (protocols)
// ├── Data/
// │   └── Repositories/  (implementations)
// └── Presentation/
//     ├── Views/
//     └── ViewModels/

Voordelen

Een gelaagde architectuur maakt onafhankelijk testen, verwisselbare implementaties en parallelle ontwikkeling door teams mogelijk.

// Test Domain in isolation: no network, no DB
// Swap RemoteUserRepo with LocalUserRepo for offline mode
// Teams own layers independently

Veelgemaakte fouten

Vermijd imports van UIKit en SwiftUI in de domeinlaag en voorkom dat bedrijfslogica in weergaven terechtkomt.

// WRONG: Domain entity with SwiftUI Color
struct Product {
  var color: Color  // UIKit/SwiftUI import in Domain!
}
// CORRECT: Use a plain string or enum
struct Product { var colorHex: String }

Korte controle

Welke laag beheert de repositoryprotocollen in een schone architectuur?

Lesoverzicht

Lagen van een schone architectuur: Domein (entiteiten, gebruiksscenario's, protocolcontracten), Data (netwerk- en database-implementaties), Presentatie (UI en ViewModels). Afhankelijkheden wijzen naar binnen, richting het domein. Het domein heeft geen afhankelijkheden van frameworks, waardoor je het volledig met eenheidstesten kunt testen.

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 “Lagen: domein, data en presentatie” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad Swift Academy, waaronder “Lagen: domein, data en presentatie”, 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 “Lagen: domein, data en presentatie”?

Bedrijfslogica scheiden van gegevenstoegang en UI in een Swift-app. 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 1 van 4.

Hoe lang duurt de les “Lagen: domein, data en presentatie”?

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. Lagen: domein, data en presentatie
  2. Use-case- en repositorypatronen
  3. Dependency inversion met protocolabstracties
  4. Lagen koppelen zonder een DI-framework
← Terug naar Swift Academy