WWDC Quick Look 💓 By SwiftGGTeam
Meet SwiftData

Meet SwiftData

元の動画を見る

ハイライト

SwiftData は、Swift 用の Apple のネイティブ データ永続化フレームワークです。@Modelマクロは Swift コードでデータ モデルを直接定義し、SwiftUI と自動的に統合します。開発者は、Core Data の面倒な定型コードを記述することなく、完全な追加、削除、変更、および iCloud 同期機能を利用できます。

主要内容

以前は、iOS でデータを永続化するためのオプションは Core Data がほぼ唯一でした。しかし、学習曲線は急峻です。理解する必要があります。.xcdatamodeldファイル、NSManagedObject、NSPredicate、NSFetchRequest、Swift と Objective-C API 間の切り替えなどの概念。単純なクエリには十数行のコードが必要な場合があり、型は安全ではなく、コンパイル時にエラーをチェックできません。

WWDC23で導入されたSwiftDataはこの状況を変える。

SwiftData は完全に Swift コードに基づいており、外部ファイル形式はありません。通常の Swift クラスを作成し、@Modelマクロ。自動的に永続化機能が備わっています。文字列、整数、日付などの値の型は直接データ属性になり、他のモデル クラスからの参照は自動的にリレーショナル属性になります。不要.xcdatamodeldファイル、コードを生成する必要はありません。スキーマは Swift コードそのものです。

クエリも簡単になります。 SwiftData がネイティブを導入PredicateそしてFetchDescriptor、完全に交換されましたNSPredicate。 Xcode でオートコンプリートを取得すると、コンパイラーが型エラーをチェックします。クエリは十数行から 2 ~ 3 行に減ります。

SwiftUI との統合はすぐに使用できます。アプリシーンに 1 つ追加します.modelContainer()修飾子、ビューで使用されます@Queryそして@Environment(\.modelContext)を使用すると、データを UI に自動的にバインドできます。モデル属性を変更すると、インターフェースが自動的に更新されます。データを挿入または削除すると、リストが自動的に更新されます。

SwiftData には、CloudKit 同期、元に戻す/やり直し、ウィジェット サポートなどのプラットフォーム機能も組み込まれています。以前は多くの追加作業が必要だった機能が、実質的に無料になりました。

データモデリング

(01:09) SwiftData のコアは次のとおりです。@Modelマクロ。これをクラスに追加すると、SwiftData がこのクラスのストレージ プロパティを自動的に分析し、対応する永続スキーマを生成します。

import SwiftData

@Model
class Trip {
    var name: String
    var destination: String
    var endDate: Date
    var startDate: Date
    var bucketList: [BucketListItem]? = []
    var livingAccommodation: LivingAccommodation?
}

キーポイント:

  • @Modelモデルには参照セマンティクスが必要なため、クラスでのみ使用できます
  • 値型属性 (String、Int、Date、struct、enum、Codable) が自動的に属性になります
  • 他のモデルクラスへの参照は自動的に関係になります
  • コレクション型 (配列) もサポートされています

(02:46) を使用できます@Attributeそして@Relationshipメタデータを追加します。

@Model
class Trip {
    @Attribute(.unique) var name: String
    var destination: String
    var endDate: Date
    var startDate: Date

    @Relationship(.cascade) var bucketList: [BucketListItem]? = []
    var livingAccommodation: LivingAccommodation?
}

キーポイント:

  • @Attribute(.unique)名前に一意性制約を追加する -@Relationship(.cascade)旅行が削除されると、関連するバケットリスト項目も段階的に削除されることを示します
  • 使用する@Transient永続化に参加しないプロパティはマークできます

コンテナとコンテキスト

03:43ModelContainer永続性バックエンドです。ModelContextデータを操作するためのインターフェースです。

コンテナを初期化するには 2 つの方法があります。

// 默认配置
let container = try ModelContainer([Trip.self, LivingAccommodation.self])

// 自定义配置
let container = try ModelContainer(
    for: [Trip.self, LivingAccommodation.self],
    configurations: ModelConfiguration(url: URL("path"))
)

SwiftUI では、修飾子を使用してコンテナを設定します。

import SwiftUI

@main
struct TripsApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .modelContainer(
            for: [Trip.self, LivingAccommodation.self]
        )
    }
}

キーポイント:

  • .modelContainer()コンテナを SwiftUI 環境に自動的に挿入します
  • URL、CloudKitコンテナ識別子、移行オプションなどを構成できます
  • SwiftUI は、modelContext も自動的に伝播します

(04:20) ビューでコンテキストを取得します。

import SwiftUI

struct ContextView: View {
    @Environment(\.modelContext) private var context
}

データのクエリ

(05:13) SwiftData はネイティブを使用しますPredicateマクロはクエリ条件を構築し、置き換えますNSPredicate

let today = Date()
let tripPredicate = #Predicate<Trip> {
    $0.destination == "New York" &&
    $0.name.contains("birthday") &&
    $0.startDate > today
}

キーポイント:

  • #Predicate強力な型チェックをサポートする Swift マクロです
  • Xcode はオートコンプリートを提供します
  • 条件式はネイティブの Swift 構文を使用します

(05:32)FetchDescriptorクエリを実行します:

let descriptor = FetchDescriptor<Trip>(predicate: tripPredicate)
let trips = try context.fetch(descriptor)

(05:46) 並べ替えを追加:

let descriptor = FetchDescriptor<Trip>(
    sortBy: SortDescriptor(\.Trip.name),
    predicate: tripPredicate
)
let trips = try context.fetch(descriptor)

キーポイント:

  • FetchDescriptor述語、ソート、プリフェッチ関係、結果制限などの複数のオプションをサポートします。 -SortDescriptorネイティブの Swift タイプとキーパスをサポート

データを変更する

(06:15) ModelContext は、完全な追加、削除、変更インターフェイスを提供します。

var myTrip = Trip(name: "Birthday Trip", destination: "New York")

// 插入新对象
context.insert(myTrip)

// 删除对象
context.delete(myTrip)

// 保存变更
try context.save()

キーポイント:

  • 通常の Swift クラスと同じようにモデル オブジェクトを作成します -insert()オブジェクトがコンテキストによって追跡され始めた後
  • 属性の変更は自動的に追跡され、次回保存するときに送信されます。
  • 元に戻す/やり直しをサポート

SwiftUI の統合

07:38@Queryプロパティ ラッパーにより、データ バインディングが非常に簡単になります。

import SwiftUI

struct ContentView: View {
    @Query(sort: \.startDate, order: .reverse) var trips: [Trip]
    @Environment(\.modelContext) var modelContext

    var body: some View {
        NavigationStack() {
            List {
                ForEach(trips) { trip in
                    // ...
                }
            }
        }
    }
}

キーポイント:

  • @Queryコンテキストからデータを自動的に取得する
  • 並べ替えとフィルタリングをサポート
  • SwiftUI はデータが変更されるとビューを自動的に更新します
  • SwiftData は新しい Observable 機能をサポートし、プロパティの変更により UI の更新が自動的にトリガーされます

詳細

コアデータからの移行

SwiftData と Core Data は共存できます。 Apple は、Core Data から SwiftData への移行に関する次のようなガイダンスを提供しています。

  • 同じ永続ストレージ ファイルを共有する
  • モデルを段階的に移行する
  • CloudKitの同期を保つ

関連ドキュメント: Core Data アプリへの SwiftData の採用

FetchDescriptor の高度な使用法

FetchDescriptor述語と並べ替えに加えて、次の機能もサポートします。

  • リレーショナル オブジェクトをプリフェッチしてデータベースのラウンドトリップを削減します
  • 結果の数を制限する
  • 未保存の変更を除外する
  • カスタマイズされた取得属性

これらのオプションを使用すると、クエリの動作を正確に制御し、パフォーマンスを最適化できます。

プラットフォームの統合

SwiftData は、複数の Apple プラットフォーム機能とシームレスに連携します。

  • CloudKit: iCloud 自動同期、追加コードは不要
  • ウィジェット: ウィジェットは SwiftData データを直接読み取ることができます
  • 元に戻す/やり直し: ModelContext 組み込みサポート
  • Spotlight: コアの Spotlight インデックス作成を統合可能

重要ポイント

1. SwiftData を使用してメモ/ToDo アプリを書き換えます

  • やるべきこと: UserDefaults またはファイルを使用して元々保存されていたメモ作成アプリケーションを SwiftData に移行します。
  • 価値がある理由: 完全なデータ クエリ機能 (日付、タグによるフィルター)、自動 iCloud 同期、元に戻すサポートを利用できます。
  • 開始方法: Note モデルを追加します@Model、使用@Query元の配列を置き換えるには、次を使用します。FetchDescriptor検索とフィルタリングを実装する

2.オフライン キャッシュをサポートするリーダー アプリを作成します

  • やるべきこと: オフラインでの閲覧と同期をサポートする RSS リーダーまたは記事収集アプリ
  • 価値がある理由: SwiftData の CloudKit 統合により、マルチデバイス同期がほぼゼロコストで実現し、FetchDescriptor のプリフェッチ機能により読書エクスペリエンスが最適化されます。
  • 開始方法: Article モデルを定義し、使用します。@Relationshipタグを関連付け、述語を使用して既読/未読フィルタリングを実装する

3.旅行計画アプリを作成します (デモの旅行アプリに似ています)

  • やるべきこと: 旅行計画、持ち物リスト、予算記録を管理する
  • 実行する価値がある理由: SwiftData のリレーショナル モデルは、当然のことながら、この複数エンティティの関連付けシナリオに適しており、SwiftUI の統合により、インターフェイスの開発が非常に高速になります。
  • 開始方法: Trip、BucketListItem、LivingAccommodation およびその他のモデルを作成し、使用します。@Relationship(.cascade)関連付けの削除を管理する

4.既存の SwiftUI アプリにデータの永続性を追加

  • 何をすべきか: メモリ内の元の状態をローカルに保持します。
  • 実行する価値がある理由: 追加するだけです@Modelそして.modelContainer()、最小限の変更で大きなメリット
  • 開始方法: 永続化する必要があるデータ モデルを特定し、追加します。@Modelマクロ、アプリエントリでコンテナを構成します

関連セッション

コメント

GitHub Issues · utterances