Sample CodeiOS, iPadOS, Mac Catalyst, macOSReviewed 2026-07-21View on Apple Developer

Building a document-based app using SwiftData

At a glance

Item Summary
Purpose Code along with the WWDC presenter to transform an app with SwiftData.
App architecture A Swift sample bundle with entry-bearing project variants End, Start, each leading to SwiftUI APIs.
Main patterns Binding-based state propagation, Publisher-backed observable state
Project style 32 scanned source file(s) across Swift, organized around ranked entry, type, and file boundaries.
Execution model Source-visible boundaries: @MainActor; none alone proves a background thread.
State/event model Source-visible mechanisms: SwiftUI state property wrapper, ObservableObject, @Published.
Key frameworks/packages SwiftUI, SwiftData, Foundation, UniformTypeIdentifiers; these are source dependencies, not architecture labels.

Project structure

Source bundle/
├── End/
│   └── FlashCard/
│       ├── SwiftDataFlashCardSample.swift
│       └── Views/
│           ├── CardEditorView.swift
│           ├── CardContainerView.swift
│           ├── CardReaderView.swift
│           ├── ContentView.swift
│           └── FlashCardView.swift
└── Start/
    └── FlashCard/
        ├── SwiftDataFlashCardSample.swift
        └── Views/
            ├── CardEditorView.swift
            ├── CardContainerView.swift
            ├── CardReaderView.swift
            ├── ContentView.swift
            └── FlashCardView.swift

Structure observations

  • Architecturally prominent files are ranked from entry points and role-named declarations; resource-only paths are omitted.
  • Primary languages: Swift.
  • The verified tree contains 10 project/configuration file(s) and 34 source declaration(s).

Overall architecture

Reference code

End/FlashCard/SwiftDataFlashCardSample.swift:11 — architecture anchor

@main
struct SwiftDataFlashCardSample: App {
    var body: some Scene {
        #if os(iOS) || os(macOS)
        DocumentGroup(editing: .flashCards, migrationPlan: FlashCardsMigrationPlan.self) {
            ContentView()
        }
        #else
        WindowGroup {
            ContentView()
                .modelContainer(previewContainer)
        }
        #endif
    }
}

Interpretation

The branches represent separate entry-bearing project variants in the downloaded bundle, not runtime calls between those variants. Each branch is intentionally collapsed at the documented framework boundary; the detailed target-local flow remains in the cited files. Ownership is claimed only where the next section cites a stored property or assignment.

Ownership and state

Ownership evidence

End/FlashCard/Views/CardEditorView.swift:11 — stored dependency or nearest verified ownership anchor

struct CardEditorView: View {
    @Bindable var card: Card
    // ...
}
Owner Object or state Relationship Mutation authority
CardEditorView Card (card) stores or receives App/module collaborators
CardEditorView FocusedField (focusedField) stores or receives Owning lexical scope
CardContainerView Content (content) stores or receives App/module collaborators
CardReaderView Color (color) stores or receives Initialized by the owner; the binding is immutable

Composition arrows indicate a source-visible construction expression or locally owned value state; aggregation means the owner stores or receives a dependency without proving exclusive lifetime ownership.

Concurrency, scheduling, and thread safety

Evidence limit: actor isolation, async/await, or Task creation does not by itself prove background-thread execution; Sendable conformance alone does not prove thread-safe mutation.

Concern Source mechanism Verified placement or handoff Evidence
Main isolation @MainActor The cited annotation marks its attached declaration or closure as main-actor isolated. End/FlashCard/Support/PreviewSampleData.swift:10

@MainActor/MainActor.run, DispatchQueue.main, and RunLoop.main are reported as distinct isolation, queue, and event-loop mechanisms. A plain Task is kept separate from Task.detached; neither is labeled as a background thread.

Reference code

End/FlashCard/Support/PreviewSampleData.swift:10 — representative execution boundary

@MainActor

State propagation, frameworks, and dependencies

Evidence limit: an import proves a source-level compilation dependency at the cited line; it does not prove runtime use, architectural adoption, or whether a Swift package is a direct application dependency.

Category Mechanism or module Verified role Evidence
State propagation SwiftUI state property wrapper A SwiftUI property wrapper supplies or observes UI state. End/FlashCard/Views/CardCarousel.swift:13
State propagation ObservableObject ObservableObject supplies an observation contract. Start/FlashCard/Model/Card.swift:10
State propagation @Published A published property can emit owner-controlled changes. Start/FlashCard/Model/Card.swift:11
Source import SwiftUI The cited file imports this module; runtime use and architectural role are not inferred. End/FlashCard/Support/Design.swift:8
Source import SwiftData The cited file imports this module; runtime use and architectural role are not inferred. End/FlashCard/Model/Card.swift:9
Source import Foundation The cited file imports this module; runtime use and architectural role are not inferred. End/FlashCard/Model/Card.swift:8
Source import UniformTypeIdentifiers The cited file imports this module; runtime use and architectural role are not inferred. End/FlashCard/Support/UTType+FlashCards.swift:8

receive(on:) describes downstream delivery scheduling, while subscribe(on:) describes upstream subscription/request/cancel scheduling. An import Combine alone establishes neither behavior nor a Store, reducer, Redux, or other application architecture.

Class and protocol design

End/FlashCard/Views/CardEditorView.swift:10 — representative type boundary

struct CardEditorView: View {
    @Bindable var card: Card
    // ...
}
Type Responsibility Depends on or conforms to
CardEditorView User-interface presentation and input forwarding View
CardEditorView User-interface presentation and input forwarding View
CardContainerView User-interface presentation and input forwarding Concrete collaborators/imported frameworks
CardReaderView User-interface presentation and input forwarding View
ContentView User-interface presentation and input forwarding View
FlashCardView User-interface presentation and input forwarding View
CardContainerView User-interface presentation and input forwarding Concrete collaborators/imported frameworks
CardReaderView User-interface presentation and input forwarding View
ContentView User-interface presentation and input forwarding View
FlashCardView User-interface presentation and input forwarding View

No local protocol conformance is claimed as protocol-oriented design; external framework conformances are listed only as dependencies.

Access control

Symbol Access Verified effect Likely rationale
selectedCardID (End/FlashCard/Views/CardCarousel.swift:13) private Use is restricted to the lexical declaration and same-file extensions allowed by Swift. Inference: keep state mutation or dependency lifetime inside the owning implementation.
focusCardID (End/FlashCard/Views/CardCarousel.swift:14) private Use is restricted to the lexical declaration and same-file extensions allowed by Swift. Inference: keep state mutation or dependency lifetime inside the owning implementation.
initialCardID (End/FlashCard/Views/CardCarousel.swift:15) private Use is restricted to the lexical declaration and same-file extensions allowed by Swift. Inference: keep state mutation or dependency lifetime inside the owning implementation.
focusedField (End/FlashCard/Views/CardEditorView.swift:12) private Use is restricted to the lexical declaration and same-file extensions allowed by Swift. Inference: keep state mutation or dependency lifetime inside the owning implementation.

Reference code

End/FlashCard/Views/CardCarousel.swift:13 — representative boundary

struct CardCarousel: View {
    @State private var selectedCardID: PersistentIdentifier?
    // ...
}

Swift declarations without a modifier are internal; explicit private, fileprivate, private(set), public, or open entries above are interpreted by language semantics. Objective-C/C samples instead rely on header and implementation boundaries, which are not equivalent to Swift lexical privacy.

Logic ownership and placement

Logic Owning type or file Placement rationale
User-interface presentation and input forwarding CardContainerView, CardEditorView, CardReaderView, ContentView The source’s View suffix makes this role explicit.

Design patterns

Pattern Source evidence Purpose or tradeoff
Binding-based state propagation End/FlashCard/Views/CardGallery.swift:12 A binding exposes controlled read/write access while the upstream owner remains authoritative.
Publisher-backed observable state Start/FlashCard/Model/Card.swift:11 Published properties notify observers while mutation remains with the state object.

Naming conventions

  • Types: View: CardContainerView, CardEditorView, CardReaderView, ContentView, FlashCardView.
  • Protocols: no local protocol declaration in the scanned source.
  • Methods: makeBody.
  • Files: End/FlashCard/SwiftDataFlashCardSample.swift, Start/FlashCard/SwiftDataFlashCardSample.swift, End/FlashCard/Views/CardEditorView.swift, Start/FlashCard/Views/CardEditorView.swift, End/FlashCard/Views/CardContainerView.swift, End/FlashCard/Views/CardReaderView.swift.

Architecture takeaways

  • SwiftDataFlashCardSample is the main source-visible entry or composition anchor for this sample.
  • Framework work reaches SwiftUI, SwiftData, UniformTypeIdentifiers through a deliberately small high-level chain; the detailed API graph remains inside the cited implementation files.
  • Stored-property evidence identifies lifecycle collaboration; it does not by itself prove exclusive object ownership.
  • Access-control conclusions separate verified language visibility from the likely design rationale.
  • The source does not justify labeling the design protocol-oriented.

Source map

Source file Relevant symbols
End/FlashCard/SwiftDataFlashCardSample.swift Cited implementation, SwiftDataFlashCardSample
End/FlashCard/Views/CardEditorView.swift Cited implementation, CardEditorView, FocusedField, CardFieldLabeledContentStyle
End/FlashCard/Views/CardCarousel.swift Cited implementation, SwiftUI state property wrapper, CardCarousel
End/FlashCard/Views/CardGallery.swift Cited implementation, CardGallery
Start/FlashCard/Model/Card.swift Cited implementation, ObservableObject, @Published, Card
End/FlashCard/Support/PreviewSampleData.swift @MainActor, Feature implementation
End/FlashCard/Support/Design.swift SwiftUI, Design
End/FlashCard/Model/Card.swift SwiftData, Foundation, Card, FlashCardsMigrationPlan, FlashCardsVersionedSchema
End/FlashCard/Support/UTType+FlashCards.swift UniformTypeIdentifiers, Feature implementation
Start/FlashCard/SwiftDataFlashCardSample.swift SwiftDataFlashCardSample
Start/FlashCard/Views/CardEditorView.swift CardEditorView, FocusedField, CardFieldLabeledContentStyle
End/FlashCard/Views/CardContainerView.swift CardContainerView
End/FlashCard/Views/CardReaderView.swift CardReaderView
End/FlashCard/Views/ContentView.swift ContentView
End/FlashCard/Views/FlashCardView.swift FlashCardView
Start/FlashCard/Views/CardContainerView.swift CardContainerView