Close Menu
  • Home
  • AI
  • Big Data
  • Cloud Computing
  • iOS Development
  • IoT
  • IT/ Cybersecurity
  • Tech
    • Nanotechnology
    • Green Technology
    • Apple
    • Software Development
    • Software Engineering

Subscribe to Updates

Get the latest technology news from Bigteetechhub about IT, Cybersecurity and Big Data.

    What's Hot

    Zane Maldonado LattePanda IOTA-Powered CG Deck Moves from Dream to Engineering Prototype

    May 26, 2026

    How Agentic AI Is Changing Network Traffic: Cisco Report

    May 26, 2026

    Apple’s incredible AirPods Pro 3 drop back below $200

    May 26, 2026
    Facebook X (Twitter) Instagram
    Facebook X (Twitter) Instagram
    Big Tee Tech Hub
    • Home
    • AI
    • Big Data
    • Cloud Computing
    • iOS Development
    • IoT
    • IT/ Cybersecurity
    • Tech
      • Nanotechnology
      • Green Technology
      • Apple
      • Software Development
      • Software Engineering
    Big Tee Tech Hub
    Home»iOS Development»swift – SwiftUI iOS 26: ViewModel protocol + generic views for multi-platform Xcode preview injection. Best practice?
    iOS Development

    swift – SwiftUI iOS 26: ViewModel protocol + generic views for multi-platform Xcode preview injection. Best practice?

    big tee tech hubBy big tee tech hubMay 21, 2026023 Mins Read
    Share Facebook Twitter Pinterest Copy Link LinkedIn Tumblr Email Telegram WhatsApp
    Follow Us
    Google News Flipboard
    swift – SwiftUI iOS 26: ViewModel protocol + generic views for multi-platform Xcode preview injection. Best practice?
    Share
    Facebook Twitter LinkedIn Pinterest Email Copy Link

    [ad_1]

    Context

    I’m building a multi-platform SwiftUI app targeting iOS 26 / macOS 26 (iPhone, iPad, Mac). I’m using MVVM with a Repository layer and the modern @Observable macro throughout. The app has list -> detail navigation and performs one-shot async data fetching.

    My goal: enable rich Xcode Previews on all three platforms without spinning up real dependencies (network, database), while keeping the production ViewModel fast (no existential boxing overhead).

    The pattern I landed on

    1. ViewModel protocol

    protocol RecipeListViewModelProtocol: AnyObject, Observable {
        var recipes: [Recipe] { get }
        var isLoading: Bool { get }
        func fetch() async
        @discardableResult func delete(id: UUID) async -> Bool
    }
    

    2. Production ViewModel

    @Observable
    final class RecipeListViewModel: RecipeListViewModelProtocol {
        private(set) var recipes: [Recipe] = []
        private(set) var isLoading = false
    
        private let repository: RecipeRepositoryProtocol
    
        init(repository: RecipeRepositoryProtocol = RecipeRepository()) {
            self.repository = repository
        }
    
        func fetch() async {
            isLoading = true
            defer { isLoading = false }
            recipes = (try? await repository.fetchAll()) ?? []
        }
    
        @discardableResult func delete(id: UUID) async -> Bool {
            guard (try? await repository.delete(id: id)) != nil else { return false }
            await fetch()
            return true
        }
    }
    

    3. Mock ViewModel (preview injection)

    @Observable
    final class RecipeListViewModelMock: RecipeListViewModelProtocol {
        var recipes: [Recipe]
        var isLoading: Bool
    
        init(recipes: [Recipe] = Recipe.samples, isLoading: Bool = false) {
            self.recipes = recipes
            self.isLoading = isLoading
        }
    
        func fetch() async {}
        @discardableResult func delete(id: UUID) async -> Bool { true }
    }
    

    4. Generic view (static dispatch, no any)

    struct RecipeList: View {
        @State var vm: VM
    
        var body: some View {
            List(vm.recipes) { recipe in
                Text(recipe.title)
            }
            .overlay { if vm.isLoading { ProgressView() } }
            .task { await vm.fetch() }
        }
    }
    

    5. Multi-platform PreviewProvider

    struct RecipeList_Previews: PreviewProvider {
        static var vm = RecipeListViewModelMock()
    
        static var previews: some View {
            Group {
                RecipeList(vm: vm)
                    .previewDevice(PreviewDevice(rawValue: "iPhone 17 Pro"))
                    .previewDisplayName("iPhone")
    
                RecipeList(vm: vm)
                    .previewDevice(PreviewDevice(rawValue: "iPad Pro 11-inch (M5)"))
                    .previewDisplayName("iPad")
    
                RecipeList(vm: vm)
                    .previewDevice(PreviewDevice(rawValue: "My Mac"))
                    .previewDisplayName("Mac")
            }
        }
    }
    

    Questions

    1. Is protocol: AnyObject, Observable + generic view (struct RecipeList) the recommended approach in SwiftUI 6 / iOS 26?

    2. Should the mock live at the ViewModel layer or the Repository layer for Xcode Previews? The alternative to the mock VM above would be injecting a mock repository into the real VM:

    @Observable
    final class RecipeRepositoryMock: RecipeRepositoryProtocol {
        func fetchAll() async throws -> [Recipe] { Recipe.samples }
        func delete(id: UUID) async throws {}
    }
    
    // in the preview:
    static var previews: some View {
        RecipeList(vm: RecipeListViewModel(repository: RecipeRepositoryMock()))
            ...
    }
    

    This exercises the real VM’s fetch/delete logic but requires the VM to be constructible in the preview. Is this the preferred approach?

    1. How do generics propagate to child views? RecipeList is generic over VM, but child views like RecipeRow only need a Recipe value and have no dependency on the VM. Is passing the model directly sufficient, or does the generic constraint need to flow down?
    struct RecipeRow: View {
        let recipe: Recipe
        var body: some View { Text(recipe.title) }
    }
    
    // used inside RecipeList:
    List(vm.recipes) { recipe in
        RecipeRow(recipe: recipe) // no VM generic needed here?
    }
    
    1. #Preview doesn’t seem to support rendering multiple devices simultaneously. Is PreviewProvider + .previewDevice() still the correct approach for side-by-side iPhone / iPad / Mac previews in iOS 26?

    2. Any architectural red flags in the pattern above?

    [ad_2]

    Source link

    generic Injection iOS Multiplatform Practice Preview protocol Swift SwiftUI ViewModel views Xcode
    Follow on Google News Follow on Flipboard
    Share. Facebook Twitter Pinterest LinkedIn Tumblr Email Copy Link
    tonirufai
    big tee tech hub
    • Website

    Related Posts

    ios – Error “Conformance of [StructType] to protocol [ProtocolType] crosses into main actor isolated code in approachable concurrency

    May 26, 2026

    Big Apple Watch AI upgrade might not arrive with iOS 27

    May 25, 2026

    ios – SwiftUI ScrollView shuffles visible content when appending paginated items mid-scroll

    May 25, 2026
    Add A Comment
    Leave A Reply Cancel Reply

    Editors Picks

    Zane Maldonado LattePanda IOTA-Powered CG Deck Moves from Dream to Engineering Prototype

    May 26, 2026

    How Agentic AI Is Changing Network Traffic: Cisco Report

    May 26, 2026

    Apple’s incredible AirPods Pro 3 drop back below $200

    May 26, 2026

    A practical guide for platform teams managing shared AI deployments

    May 26, 2026
    Timer Code
    15 Second Timer for Articles
    20
    About Us
    About Us

    Welcome To big tee tech hub. Big tee tech hub is a Professional seo tools Platform. Here we will provide you only interesting content, which you will like very much. We’re dedicated to providing you the best of seo tools, with a focus on dependability and tools. We’re working to turn our passion for seo tools into a booming online website. We hope you enjoy our seo tools as much as we enjoy offering them to you.

    Don't Miss!

    Zane Maldonado LattePanda IOTA-Powered CG Deck Moves from Dream to Engineering Prototype

    May 26, 2026

    How Agentic AI Is Changing Network Traffic: Cisco Report

    May 26, 2026

    Subscribe to Updates

    Get the latest technology news from Bigteetechhub about IT, Cybersecurity and Big Data.

      • About Us
      • Contact Us
      • Disclaimer
      • Privacy Policy
      • Terms and Conditions
      © 2026 bigteetechhub.All Right Reserved

      Type above and press Enter to search. Press Esc to cancel.