Activity 1
Build the core vertical slice
Implement library list, course detail, completion update, and navigation before adding search or editing.
Hint: Verify that returning to the list reflects completion through a new snapshot.
UIKit Development
Integrate navigation, adaptive collections, forms, diffable state, interoperability, and accessibility in one UIKit feature.
Before you begin
Learning stage
The mini project is a Learning Library with a searchable course collection, course detail, completion state, and an editor sheet. Build vertical slices: application shell and routes, collection layout and snapshot, detail navigation, editing and validation, then accessibility and adaptation. Keep data in a store and let controllers render state and emit intent.
Use a tab or navigation root, a collection view with compositional layout, stable IDs with a diffable data source, and a coordinator for transitions. The editor owns temporary form input until Save. Add one interoperability boundary—such as a SwiftUI progress summary hosted in UIKit—to practice explicit ownership rather than mixing frameworks everywhere.
Completion means more than a happy-path demo. Verify loading, empty, content, filtered-empty, validation-error, and restored states. Test large text, VoiceOver, right-to-left layout, compact and wide windows, cancellation, repeated presentation, and controller deallocation. Document trade-offs and one next refactoring you would make as the feature grows.
Learning stage
The coordinator assembles dependencies once and keeps route decisions outside individual screens.
@MainActor
final class AppCoordinator {
private let store: LearningStore
let rootViewController: UINavigationController
init(store: LearningStore) {
self.store = store
self.rootViewController = UINavigationController()
}
func start() {
let library = LibraryViewController(store: store)
library.onSelect = { [weak self] id in self?.showCourse(id) }
library.onCreate = { [weak self] in self?.showEditor() }
rootViewController.setViewControllers([library], animated: false)
}
private func showCourse(_ id: Course.ID) {
let detail = CourseDetailViewController(courseID: id, store: store)
rootViewController.pushViewController(detail, animated: true)
}
private func showEditor() {
let editor = CourseEditorViewController()
editor.onSave = { [weak self, weak editor] draft in
self?.store.add(draft)
editor?.dismiss(animated: true)
}
rootViewController.present(UINavigationController(rootViewController: editor),
animated: true)
}
}Learning stage
Connect the UIKit concept to complete, maintainable application features.
Learning stage
Identify lifecycle, ownership, identity, layout, accessibility, and user-experience risks.
Learning stage
Build the behavior in a small Xcode project and inspect it across realistic states.
Activity 1
Implement library list, course detail, completion update, and navigation before adding search or editing.
Hint: Verify that returning to the list reflects completion through a new snapshot.
Activity 2
Test all named UI states, large text, VoiceOver, RTL, window resizing, keyboard flow, repeated presentations, and deallocation. Record findings and fixes.
Hint: Write acceptance criteria before the review so success is observable.
Learning stage
Answer each question before revealing the explanation.
QUESTION 1
In a dedicated store or model layer
Controllers and cells may be recreated; durable application state needs independent ownership.
QUESTION 2
It validates architecture, data flow, navigation, and user value end to end while changes remain inexpensive.
A complete narrow path exposes integration problems earlier than disconnected screen shells.
Learning stage
Explain the design in terms of lifecycle, identity, ownership, system behavior, and trade-offs.
Short answer: A store owns data, controllers render state, a coordinator owns routes, and diffable snapshots map stable identity into the collection.
I would explain boundaries first, then trace selection, editing, save, and UI refresh. I would show how lifecycle and cancellation are handled, why the layout adapts to width, how accessibility is verified, and where UIKit–SwiftUI interoperability has one clear source of truth. Finally I would name limits and the next evidence-driven refactor.
Possible follow-ups
Learning stage
The Learning Library integrates UIKit's core systems into a maintainable vertical feature whose state, identity, routes, lifecycle, and accessibility can be explained and tested.