Lag: domæne, data og præsentation
Adskil forretningslogik fra dataadgang og UI i en Swift-app.
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 / UIKitDomæ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 SwiftDataAnvendelsestilfæ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 swappableMappestruktur
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 independentlyAlmindelige 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.
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
- Lag: domæne, data og præsentation
- Use case- og repository-mønstre
- Dependency inversion med protokolabstraktioner
- Sammensætning af lag uden et DI-framework