• トップ
  • ブログ一覧
  • SwiftDataとは?
  • SwiftDataとは?

    村中(エンジニア)村中(エンジニア)
    2024.07.24

    IT技術

    SwiftData とは?

    SwiftDataは、データモデリングと管理のためのフレームワークです。Swiftの新しいマクロシステムを活用し、シームレスなAPI体験を提供します。また、SwiftUIと統合され、ウィジェットなどの他のプラットフォーム機能と連携して動作します。

    SwiftDataの主要機能

    @Modelマクロ

    SwiftDataの中心的な機能の一つが、@Modelマクロです。このマクロを使用することで、Swiftコードから直接モデルのスキーマを定義できます。SwiftDataのスキーマは通常のSwiftコードですが、必要に応じてプロパティに追加のメタデータを注釈することもできます。これにより、強力な機能がモデルオブジェクトに追加されます。クラスに@Modelを付与するだけで、スキーマが生成されます。

    1import SwiftData
    2
    3@Model
    4class Trip {
    5var name: String
    6var destination: String
    7var endDate: Date
    8var startDate: Date
    9
    10var bucketList: [BucketListItem]? = []
    11var livingAccommodation: LivingAccommodation?
    12}

    プロパティの管理

    SwiftDataは、プロパティにメタデータを追加することで、ユニーク制約や削除ルールなどを指定できます。

    1@Model
    2class Trip {
    3// ユニーク制約のあり
    4@Attribute(.unique) var name: String
    5var destination: String
    6var endDate: Date
    7var startDate: Date
    8
    9// 削除時にカスケード削除される
    10@Relationship(.cascade) var bucketList: [BucketListItem]? = []
    11var livingAccommodation: LivingAccommodation?
    12}

    データの取得と操作

    SwiftDataを使用してデータを取得し、変更するための主要なオブジェクトは、ModelContainerとModelContextです。

    1// スキーマのみで初期化
    2let container = try ModelContainer([Trip.self, LivingAccommodation.self])

    カスタマイズしたい場合は、configurationsで指定します。

    1// カスタマイズ設定で初期化
    2let container = try ModelContainer(
    3for: [Trip.self, LivingAccommodation.self],
    4configurations: ModelConfiguration(url: URL("path")) // カスタムURLで初期化
    5)

    SwiftUIとの統合

    SwiftDataはSwiftUIと共に使用することを念頭に設計されており、これらのフレームワークを一緒に使用することが推奨されている。.modelContainerで指定することにより、自動的にModelとの関係を確立されます。設定によりトラッキングや値の取得・保存・更新が可能になります。

    1import SwiftUI
    2
    3@main
    4struct TripsApp: App {
    5    var body: some Scene {
    6        WindowGroup {
    7            ContentView()
    8        }
    9        .modelContainer(
    10            for: [Trip.self, LivingAccommodation.self] // モデルコンテナを設定
    11        )
    12    }
    13}

    SwiftUIのビュー内でModelContextにアクセスします。

    1import SwiftUI
    2
    3struct ContextView: View {
    4// モデルコンテキストを@Environmentで取得
    5@Environment(\.modelContext) private var context
    6}

    データの取得とクエリ

    SwiftDataでは、PredicateとFetchDescriptorを使用してデータを取得できます。

    1let today = Date()
    2// Predicateで条件を指定
    3let tripPredicate = #Predicate {
    4$0.destination == "New York" && // 目的地がニューヨーク
    5$0.name.contains("birthday") && // 名前に「birthday」を含む
    6$0.startDate > today // 開始日が今日以降
    7}
    8
    9let descriptor = FetchDescriptor(predicate: tripPredicate)
    10// フェッチの実行
    11let trips = try context.fetch(descriptor)

    SortDescriptorを使用してデータをソートして取得することもできます。

    1let descriptor = FetchDescriptor(
    2sortBy: SortDescriptor(\Trip.name), // 名前でソート
    3predicate: tripPredicate // クエリ条件を適用
    4)
    5
    6// フェッチの実行
    7let trips = try context.fetch(descriptor)

    データの挿入、削除、保存

    ModelContextを使用してデータの操作が可能です。

    1// 新しい旅行オブジェクトを作成
    2var myTrip = Trip(name: "Birthday Trip", destination: "New York")
    3
    4// 新しい旅行を挿入
    5context.insert(myTrip)
    6
    7// 既存の旅行を削除
    8context.delete(myTrip)
    9
    10// コンテキストの変更を手動で保存
    11try context.save()

    SwiftUIでの@Queryの使用

    SwiftDataはSwiftUIとシームレスに統合されており、@Queryプロパティラッパーを使用して簡単にデータを読み込むことができます。

    1import SwiftUI
    2
    3struct ContentView: View {
    4    // 開始日でソートして旅行データを取得
    5    @Query(sort: \.startDate, order: .reverse) var trips: [Trip]
    6    // モデルコンテキストを取得
    7    @Environment(\.modelContext) var modelContext
    8
    9    var body: some View {
    10        NavigationStack {
    11            List {
    12                ForEach(trips) { trip in
    13                    // リスト項目の表示
    14                }
    15            }
    16        }
    17    }
    18}

    SwiftDataの利点

    • コード中心のアプローチ:

    外部ファイルフォーマットを使用せず、すべての設定をSwiftコード内で完結します。

    •  シームレスな統合:

    SwiftUI、ウィジェットなどとの自然な統合が可能です。

    •  直感的なデータ管理:

    値型プロパティや参照型の関係を管理でき、ユニーク制約や削除ルールなども設定可能です。

    •  容易なデータ操作:

    データの取得、変更、保存が簡単に行えます。

    まとめ

    SwiftDataは、Swiftの機能を活用したデータ管理のAPIです。マクロシステムを使用してコードに焦点を合わせ、モデルのスキーマを設定することができます。コードは非常に簡潔でわかりやすく、今後Swiftでデータ管理する際は一番の選択肢として挙げられます。

     

    参考資料

    https://developer.apple.com/videos/play/wwdc2023/10187/

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background