Use Case and Repository Patterns
Defining use cases as Swift protocols and implementing repository interfaces.
What is a Use Case?
A use case (interactor) encapsulates a single business action, orchestrating domain entities and repositories.
struct PlaceOrderUseCase {
let cart: CartRepository
let payment: PaymentService
let orders: OrderRepository
func execute(userId: Int) async throws -> Order {
let items = try await cart.items(for: userId)
let receipt = try await payment.charge(items: items)
return try await orders.create(receipt: receipt)
}
}Single Responsibility
Each use case does exactly one thing. Multiple responsibilities mean multiple use cases.
// One use case per business action:
struct FetchUserUseCase { ... }
struct UpdateUserUseCase { ... }
struct DeleteUserUseCase { ... }