Files
gh-sjungling-claude-plugins…/skills/ios-swift-expert/references/patterns.md
2025-11-30 08:57:43 +08:00

1.7 KiB

Common Patterns & Solutions

Design patterns and solutions for iOS and macOS development.

Pattern: Dependency Injection

Problem: Tight coupling makes testing difficult Solution: Use protocol-based dependency injection

protocol NetworkServiceProtocol {
    func fetch<T: Decodable>(_ endpoint: Endpoint) async throws -> T
}

struct ContentView: View {
    @StateObject private var viewModel: ContentViewModel

    init(networkService: NetworkServiceProtocol = NetworkService()) {
        _viewModel = StateObject(wrappedValue: ContentViewModel(networkService: networkService))
    }

    var body: some View {
        // View implementation
    }
}

Pattern: Result Builders

Problem: Complex view hierarchies Solution: Use result builders for DSL-like syntax

@resultBuilder
struct ViewArrayBuilder {
    static func buildBlock(_ components: [AnyView]...) -> [AnyView] {
        components.flatMap { $0 }
    }

    static func buildExpression<V: View>(_ expression: V) -> [AnyView] {
        [AnyView(expression)]
    }
}

func createViews(@ViewArrayBuilder _ builder: () -> [AnyView]) -> [AnyView] {
    builder()
}

Pattern: Coordinator for Navigation

Problem: Complex navigation logic scattered across views Solution: Centralize navigation in coordinator

@MainActor
final class AppCoordinator: ObservableObject {
    @Published var path = NavigationPath()

    enum Route: Hashable {
        case detail(id: String)
        case settings
        case profile
    }

    func navigate(to route: Route) {
        path.append(route)
    }

    func pop() {
        path.removeLast()
    }

    func popToRoot() {
        path = NavigationPath()
    }
}