You've joined a company with a huge UIKit codebase, but Apple is pushing SwiftUI. What now? Do you refactor? Stick with what works? Mix technologies? This is the reality of iOS development in 2025. The ecosystem is more fragmented than ever. Some teams are still working with UIKit + Storyboards from pre-2020 projects. Others have transitioned to mixed codebases with programmatic UIKit, coordinators, and MVVM. Newer projects are full SwiftUI with async/await and the Observation framework. And some projects are... all of the above. In this series, I'm building the same Ghibli Films app using different tech stacks and architectures so you can see real-world tradeoffs—not just theoretical debates. The sample app covers typical iOS development patterns: REST API calls, multiple network requests, image loading, favorites list, navigation flows, search with debouncing, light/dark mode, and more. 🎯 TECH STACKS WE'LL EXPLORE: **Legacy (Pre-2020):** - UIKit + Storyboards - MVC architecture - Completion handlers & delegates - The challenges: merge conflicts, massive view controllers, tight coupling **Transitioning Projects:** - Mixed UIKit/SwiftUI codebases - Multiple storyboards or programmatic UI - MVVM to manage complexity - Coordinator pattern for navigation - Introduction of Combine or async/await **Modern SwiftUI (2020-2021):** - SwiftUI with @StateObject - Still using completion handlers for networking - NavigationView struggles - Early performance challenges **Most Modern (2025):** - 100% SwiftUI with Observation framework - Swift concurrency (async/await) throughout - NavigationStack (finally works intuitively!) - Modern testing approaches - Performance optimizations 🤔 KEY QUESTIONS I AM TRYING TO FIGURE OUT: - Is Swift concurrency worth the learning curve? - When do you actually need view models in SwiftUI? - How do architectures like TCA (The Composable Architecture) compare to simpler approaches? - What's the right balance between abstraction and simplicity? - Should you refactor legacy UIKit or leave it alone? This isn't about declaring one approach "better." It's about understanding what you'll actually encounter in production codebases and making informed decisions for your specific situation—whether you're maintaining a 5-year-old app, planning a migration, or starting fresh. I prefer simple, consistent tech stacks over chasing the latest trends. But "simple" looks different depending on when your project started and what complexity you're managing. Let's figure out what works. Overview 00:00 Introduction to iOS Development in 2025 00:32 Overview of the Sample App 02:50 Legacy Projects and UIKit 04:32 Transitioning to Modern Technologies 07:15 Swift Concurrency vs Completion Handlers 10:53 Modern SwiftUI Projects 17:42 Architectural Patterns and Preferences: MVVM, MV, TCA 21:04 Conclusion and Next Steps If you liked what you learned and you want to see more, check out one of my courses! 👨💻 my macOS development course 👨💻 my Core Data and SwiftUI course 👩🏻💻 SwiftUI layout course 👩🏻💻 Combine Framework course ⬇️ Download project files: ------------------ What to Watch Next - Coordinator Pattern with UIKit ------------------- 👉 About Me Hi, I’m Karin Prater—an iOS developer and educator helping you master Swift, SwiftUI, and real-world iOS app development. I create no-fluff tutorials on SwiftUI architecture, UIKit, Combine, Core Data, and how to build iPhone and macOS apps with best practices. Subscribe for weekly deep dives into Xcode, Swift design patterns, and everything you need to grow as an Apple developer. New videos every week on iOS development, SwiftUI, and app architecture that actually scales. #SwiftUI










