WWDC Quick Look 💓 By SwiftGGTeam
Build an app with SwiftData

Build an app with SwiftData

元の動画を見る

ハイライト

SwiftData パス@Modelマクロ、@Queryプロパティラッパーと.modelContainer()修飾子を使用例すると、SwiftUI アプリケーションはわずか数行のコードでデータを永続化できると同時に、Observable 機能、自動保存、ドキュメントベースのアプリケーション サポートを自動的に取得できます。

主な内容

記憶から永続化へ: 一歩手前

以前は、SwiftUI アプリケーションにデータ永続性を追加するには、Core Data を導入し、複雑なオブジェクト グラフ管理、コンテキスト保存、および移行ルールを学習する必要がありました。このため、多くの開発者は永続化を諦めています。データはメモリ内にのみ存在し、アプリケーションを閉じると失われます。

SwiftData はこの状況を変えます。これにより、UI を宣言するのと同じくらい簡単にデータの永続化が可能になります。

(03:33) 既存のモデル クラスに追加します@Modelマクロを使用例すると、永続化可能な SwiftData モデルになります。同時に、Observable プロトコルの一貫性を自動的に取得します。@Published、不要ObservableObject

@Query 自動クエリと更新

(05:52) 使用例済み@Query交換する@State、ビューは SwiftData ストア内のモデルを直接クエリできます。データが変更されるとビューが自動的に更新されます。@State行動が一貫している。

ModelContainer 構成ストレージ スタック

(08:27) 合格しました.modelContainer()モディファイアは、ビュー階層内のストレージ スタックを構成します。 WindowGroup レベルのコンテナは、グループによって作成されたすべてのウィンドウで共有されます。個々のビューに対して独立したコンテナを構成することもできます。

自動保存

(11:13) SwiftData は、UI イベントおよびユーザー入力中にモデル コンテキストを自動的に保存するため、手動で呼び出す必要はありません。save()。明示的な呼び出しは、即時の永続性が必要なシナリオ (データ共有前など) でのみ必要です。

ドキュメントベースのアプリケーション

(13:34) SwiftUI は、SwiftData 駆動のドキュメント アプリケーションをサポートします。使用例DocumentGroupイニシャライザはモデル タイプとコンテンツ タイプを指定し、SwiftData は各ドキュメントのストレージを自動的に処理します。ユーザーは標準的なドキュメント操作 (作成、開く、保存、共有) を実行できます。

##詳細

SwiftData モデルを定義する

(03:33) フラッシュカード アプリケーションCardモデル変換:

import SwiftData

@Model
final class Card {
    var front: String
    var back: String
    var creationDate: Date

    init(front: String, back: String, creationDate: Date = .now) {
        self.front = front
        self.back = back
        self.creationDate = creationDate
    }
}

キーポイント:

  • import SwiftDataフレームワークの紹介 -@Modelマクロによりクラスが永続化される
  • 必要ありませんObservableObject、不要@Published
  • @ModelObservable プロトコル準拠を自動的に追加
  • 保存されたプロパティは自動的に監視可能なプロパティになります

SwiftData モデルにバインドする

(04:25) ビューの編集用@Bindableバインディングを作成します。

struct CardEditorView: View {
    @Bindable var card: Card

    var body: some View {
        Form {
            TextField("Front", text: $card.front)
            TextField("Back", text: $card.back)
        }
    }
}

キーポイント:

  • @Bindable最も軽量なバインディング ラッパーです -$card.front生成するBinding<String>
  • TextField境界値の読み取りと書き込み
  • 必要ありません@ObservedObject

クエリモデル

(05:52) コンテンツビュー用@Queryデータを取得します。

struct ContentView: View {
    @Query private var cards: [Card]

    var body: some View {
        List(cards) { card in
            CardRow(card: card)
        }
    }
}

キーポイント:

  • @QuerySwiftData ストレージからのデータを自動的にクエリする
  • データが変更されるとビューが自動的に更新されます
  • 並べ替え、フィルタリング、アニメーション設定をサポート
  • ビューによって継承されたモデル コンテキストをデータ ソースとして使用例します

並べ替えを伴うクエリ:

@Query(sort: \Card.creationDate, order: .reverse) private var cards: [Card]

キーポイント:

  • sortパラメータはソートキーのパスを指定します -order: .reverse降順に並べ替える
  • 複数フィールドの並べ替えとフィルター条件もサポートします

ModelContainer を設定する

(08:27) はアプリ定義で構成されます。

@main
struct FlashCardApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .modelContainer(for: Card.self)
    }
}

キーポイント:

  • .modelContainer(for:)WindowGroup のストレージ スタックをセットアップする
  • このグループによって作成されたすべてのウィンドウは同じコンテナを共有します
  • サブビューはコンテナ内で宣言されたモデルタイプでのみ動作できます
  • コンテナーが構成されていないビューでは SwiftData を使用例できません

プレビュー用のサンプル データを提供する

(09:24) プレビュー データが入ったメモリ内コンテナーを作成します。

import SwiftData

@MainActor
let previewContainer: ModelContainer = {
    let schema = Schema([Card.self])
    let config = ModelConfiguration(schema: schema, isStoredInMemoryOnly: true)
    let container = try! ModelContainer(for: schema, configurations: config)

    let sampleCards = [
        Card(front: "Who invented the compiler?", back: "Grace Hopper"),
        Card(front: "What is SwiftData?", back: "A persistence framework")
    ]

    for card in sampleCards {
        container.mainContext.insert(card)
    }

    return container
}()

#Preview {
    ContentView()
        .frame(minWidth: 500, minHeight: 500)
        .modelContainer(previewContainer)
}

キーポイント:

  • isStoredInMemoryOnly: trueインメモリデータベースを作成する
  • プレビューで使用例.modelContainer(previewContainer)注入する
  • UI のデバッグを容易にするために、実際のデータがプレビューに表示されます -@MainActor必ずメインスレッド上で作成してください

モデルを作成して保存する

(10:30) モデル コンテキストを介して新しいデータを挿入します。

struct CardListView: View {
    @Environment(\.modelContext) private var modelContext
    @Query private var cards: [Card]

    var body: some View {
        List(cards) { card in
            Text(card.front)
        }
        .toolbar {
            Button("Add", systemImage: "plus") {
                let newCard = Card(front: "Sample Front", back: "Sample Back")
                modelContext.insert(newCard)
            }
        }
    }
}

キーポイント:

  • @Environment(\.modelContext)ビューのモデルコンテキストを取得する -modelContext.insert()新しいモデルをコンテキストに追加
  • SwiftData は自動的に保存されるため、手動で呼び出す必要はありませんsave()- UI イベントとユーザー入力によってトリガーされる自動保存
  • 即時の永続性が必要な場合にのみ明示的に呼び出されますsave()

ドキュメントベースのアプリケーション

(13:34) SwiftData を保存されたドキュメント アプリケーションとして使用例します。

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

キーポイント:

  • DocumentGroup(editing:contentType:)モデルタイプとコンテンツタイプを指定する
  • SwiftData はドキュメントごとに個別のモデル コンテナを自動的に作成します
  • 手動設定は必要ありません.modelContainer()- 標準的なドキュメント操作の取得: 作成、開く、保存、共有

コンテンツ タイプを定義します。

import UniformTypeIdentifiers

extension UTType {
    static var flashCards: UTType {
        UTType(exportedAs: "com.example.flashcards")
    }
}

Info.plist で次のように宣言します。

<key>UTExportedTypeDeclarations</key>
<array>
    <dict>
        <key>UTTypeIdentifier</key>
        <string>com.example.flashcards</string>
        <key>UTTypeDescription</key>
        <string>Flash Cards Deck</string>
        <key>UTTypeConformsTo</key>
        <array>
            <string>com.apple.package</string>
        </array>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>public.filename-extension</key>
            <string>sampledeck</string>
        </dict>
    </dict>
</array>

キーポイント:

  • コンテンツ タイプ識別子は、コード内の識別子と一致している必要があります。
  • SwiftData ドキュメントのタイプはパッケージです
  • システムを識別しやすいようにファイル拡張子を指定します -com.apple.packageディレクトリ構造を表すドキュメント

重要なポイント

  1. 既存の SwiftUI アプリケーションにデータの永続性を追加します

    • モデルクラスに追加@Modelマクロ、置換@Stateのために@Query- アプリ定義に追加.modelContainer(for:)- データ層を書き直す必要がなく、変更量は最小限です
    • 入口:@Model + @Query + .modelContainer()
  2. クロスプラットフォームのメモ作成アプリケーションを作成する

    • SwiftData を使用例してメモを保存し、iOS、macOS、watchOS、tvOS をサポート
    • 使用例する@Queryフォルダーとタグの並べ替えとフィルター機能
    • 入口:@Query(sort: \Note.creationDate) + \Note.folder
  3. ドキュメントベースの作成ツールを構築する

    • 使用例するDocumentGroup各ドキュメントを個別の SwiftData ストアにする
    • ユーザーは異なるウィンドウで異なるドキュメントを開くことができます
    • ドキュメントを直接共有および同期できます
    • 入口:DocumentGroup(editing: Model.self, contentType: .customType)
  4. プレビュー用に再利用可能なサンプル データ コンテナを作成します

    • 作成するpreviewContainerさまざまなテストデータが含まれる単一のインスタンス
    • すべてのプレビューは同じメモリ内データベースを共有します
    • 入口:ModelConfiguration(isStoredInMemoryOnly: true)

関連セッション

コメント

GitHub Issues · utterances