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

    From Nature publication to catalyzing Computational Discovery

    May 21, 2026

    The Agent Stack Bet – O’Reilly

    May 21, 2026

    Cisco Named a Leader in the 2026 Gartner® Magic Quadrant™ for Enterprise Wired and Wireless LAN Infrastructure

    May 21, 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, 2026003 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


    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?



    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 – Is a referral system that unlocks discounted IAP offerings (not direct premium access) allowed under App Store Guidelines?

    May 20, 2026

    swift – Changing corner radius for popover modal UIViewController in iOS 26

    May 19, 2026

    ios – Circular tick-ring briefly rotates backward once after app returns from background

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

    Editors Picks

    From Nature publication to catalyzing Computational Discovery

    May 21, 2026

    The Agent Stack Bet – O’Reilly

    May 21, 2026

    Cisco Named a Leader in the 2026 Gartner® Magic Quadrant™ for Enterprise Wired and Wireless LAN Infrastructure

    May 21, 2026

    Where are my emails?

    May 21, 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!

    From Nature publication to catalyzing Computational Discovery

    May 21, 2026

    The Agent Stack Bet – O’Reilly

    May 21, 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.