← Docs

Recipe: SwiftUI view scaffold

Drop-in template for a production SwiftUI view with loading, error, and empty states wired to a Meridian-licensed API.

Scaffold

import SwiftUI

struct ContentView: View {
    @StateObject private var vm = ViewModel()

    var body: some View {
        Group {
            if vm.isLoading { ProgressView() }
            else if let error = vm.errorMessage { Text(error) }
            else if vm.items.isEmpty { Text("Nothing here yet") }
            else { List(vm.items) { item in Text(item.title) } }
        }
        .task { await vm.fetch() }
    }
}

ViewModel

@MainActor
final class ViewModel: ObservableObject {
    @Published var items: [Item] = []
    @Published var isLoading = false
    @Published var errorMessage: String?

    func fetch() async {
        isLoading = true; defer { isLoading = false }
        do {
            let data = try await MeridianAPI.shared.getItems()
            items = data
        } catch { errorMessage = error.localizedDescription }
    }
}