![村中(エンジニア)](/_next/image?url=https%3A%2F%2Fapi.rightcode.co.jp%2Fwp-content%2Fuploads%2F2023%2F11%2F%E7%9D%80%E8%89%B2%E2%91%A0-150x150.jpeg&w=64&q=75)
SwiftDataとは?
![村中(エンジニア)](/_next/image?url=https%3A%2F%2Fapi.rightcode.co.jp%2Fwp-content%2Fuploads%2F2023%2F11%2F%E7%9D%80%E8%89%B2%E2%91%A0-150x150.jpeg&w=64&q=75)
IT技術
![](/_next/image?url=https%3A%2F%2Fapi.rightcode.co.jp%2Fwp-content%2Fuploads%2F2024%2F07%2Fversatile_thumbnai_Swift.png&w=3840&q=75)
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でデータ管理する際は一番の選択肢として挙げられます。
参考資料
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ