A working UIKit-to-SwiftUI migration with a buildable baseline and both interfaces sharing the same data.
iOS 15+ · Swift · MIT License
- Create, edit, complete, search, filter, and delete tasks.
- Switch between the original UIKit interface and its SwiftUI replacement.
- Preserve the same Codable model, UUIDs, storage location, and repository.
- Inspect the tagged UIKit baseline and review the migration as a real Git diff.
Open SwiftUI Modernization.xcodeproj in Xcode 16 or later. The shared scheme has the same name. No third-party Swift packages are required. Builds were checked with Xcode 27; minimum OS declarations are not a claim that every older OS was runtime-tested.
Select an iPhone or iPad simulator and run. Load examples or create a task, then switch interfaces using the top control. No backend or credentials are required.
The app targets iOS 15. The UIKit baseline uses older APIs, but Xcode 27 rejects deployment targets below iOS 15.
Bundle identifier: com.dd.swiftuimodernization.
Create a high-priority task in UIKit, switch to SwiftUI, mark it complete, then return to UIKit and filter to Done. Relaunch to confirm the same data persists.
TaskRepository handles disk access, TaskQuery handles search/filter rules, and TaskStore is the shared observable mutation boundary. LegacyTaskBoard embeds the original navigation controller through UIViewControllerRepresentable. The SwiftUI replacement uses the same store.
Run swift test for filter composition, identity-preserving persistence, and corrupt-data handling. Follow the migration parity checklist to compare both interfaces.
This is a deliberately bounded migration case study, not a claim about a third-party production app. It does not include a remote API, analytics, or performance benchmark claims.
See PRIVACY.md for storage and network behavior. Sample data is fictional.
MIT. Original source and app artwork are included under the same license.
