Swift Academy · Lektion

Lag: domæne, data og præsentation

Adskil forretningslogik fra dataadgang og UI i en Swift-app.

Lektion 1 af 413 trin

Lag: domæne, data og præsentation er en gratis Swift Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Swift Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Swift Academy-kurset indeholder 4 lektioner i alt.

Ren arkitektur i Swift

Ren arkitektur opdeler koden i lag: domæne (forretningslogik), data (persistens/netværk) og præsentation (brugergrænseflade).

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

Domænelaget

Domænelaget indeholder forretningsentiteter, anvendelsestilfælde og repository-protokoller. Det har ingen afhængigheder til UIKit, SwiftUI eller databaser.

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

Anvendelsestilfælde i domænet

Et anvendelsestilfælde indkapsler én specifik forretningshandling. Det afhænger kun af repository-protokoller fra domænet.

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

Repository-protokoller i domænet

Repository-protokoller definerer kontrakten for dataadgang. Domænet ejer protokollen, mens datalaget leverer implementeringen.

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

Datalaget

Datalaget implementerer domæneprotokoller ved hjælp af konkrete teknologier (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 */ }
}

Dataoverførselsobjekter

DTO'er er Codable-typer, der bruges i datalaget til at afkode API-svar, som derefter omdannes til domæneentiteter.

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

Præsentationslaget

Præsentationslaget indeholder ViewModels og SwiftUI-visninger. Det kalder anvendelsestilfælde og eksponerer observerbar tilstand.

// 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)
  }
}

Afhængighedsretning

Afhængigheder peger indad: Præsentation afhænger af domænet, og data afhænger af domænet. Domænet afhænger ikke af noget.

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

Mappestruktur

Organisér Swift-filer efter lag og derefter efter funktion i store apps.

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

Fordele

Lagdelt arkitektur muliggør uafhængig testning, udskiftelige implementeringer og parallel udvikling i teamet.

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

Almindelige fejl

Undgå at importere UIKit/SwiftUI i domænelaget, og undgå at forretningslogik siver ind i visningerne.

// 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 }

Hurtigt tjek

Hvilket lag ejer repository-protokollerne i ren arkitektur?

Opsummering af lektionen

Lagene i ren arkitektur: domæne (entiteter, anvendelsestilfælde, protokolkontrakter), data (implementeringer af netværk og database), præsentation (brugergrænseflade og ViewModels). Afhængigheder peger indad mod domænet. Domænet har ingen afhængigheder til rammeværker, hvilket gør det fuldt enhedstestbart.

Gratis at komme i gang

Lær Swift med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
122
Lektioner
409

Ofte stillede spørgsmål

Er lektionen “Lag: domæne, data og præsentation” gratis?

Ja — alle 3 lektioner i læringssporet Swift Academy, inklusive “Lag: domæne, data og præsentation”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Swift Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Lag: domæne, data og præsentation”?

Adskil forretningslogik fra dataadgang og UI i en Swift-app. Du øver dig i Swift Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Swift Academy?

Der kræves ingen tidligere erfaring. Swift Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Lag: domæne, data og præsentation”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Swift Academy-lektion?

Ja. Alle Swift Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Lag: domæne, data og præsentation
  2. Use case- og repository-mønstre
  3. Dependency inversion med protokolabstraktioner
  4. Sammensætning af lag uden et DI-framework
← Tilbage til Swift Academy