-
SwiftDataについて
SwiftDataはSwiftのために作られた、パワフルで表現豊かな永続性のあるフレームワークです。Swiftコードから直接得たデータをモデル化したり、SwiftDataをモデルに活用したりSwiftUIに統合したりする方法について解説します。
関連する章
- 0:00 - Intro
- 1:07 - Using the model macro
- 3:17 - Working with your data
- 7:02 - Use SwiftData with SwiftUI
- 8:10 - Wrap-up
リソース
関連ビデオ
WWDC23
-
ダウンロード
どうも Ben Trumbullです みなさんにSwiftDataをご紹介します
SwiftDataはデータモデルと管理のための パワフルなフレームワークで 現代のSwiftアプリを向上させます SwiftUI同様 外部ファイル形式がなく コードだけに集中し シームレスなAPI体験の作成に 新しいマクロシステムを使用しています
SwiftDataはシームレスな API体験のために Swift language macrosによる 表現性に頼ります またSwiftUIと自然的に統合し CloudKitやWidgetsなどの機能とも うまく作動します ここでは@Model macroとSwiftコードからの データを直接モデルにできる 機能についてお話しします SwiftDataでのデータのfetchと 修正についてご紹介し SwiftDataとシームレスに動く ほかのフレームワークの 概要をみなさんに説明して 締めくくりたいと思います まずは@Modelからです @Modelは新しいSwift macroで Swif codeからのmodel schemaを 定義します SwiftData schemaは 普通のSwift codeですが 必要ならmetadataでpropertiesに アノテーションをつけることができます このschemaでSwiftDataはモデルに パワフルな機能性を足すことができます Classに@Modelを飾るだけで schema生成されます SwiftDataのモデルは アプリのschemaの源で 持続性のある体験を可能にします classの格納型プロパティを 永続型プロパティに変えるのです モデルに@Modelを足せば 可能性が広がります SwiftDataは値型プロパティを 属性としてすぐ使えるよう ネイティブに適合します これらのプロパティはstringやint floatのようなbasic value typesを含みます またstructsやenumsのような complex value typesや collectionsのような codable typesも含みます SwiftDataはreference typesを relationshipsとしてモデル化し relationshipsと数々のmodel typesで model types間にリレーションシップを 作ることもできます @Modelはすべての格納型プロパティを あなたの型で変換します プロパティのmetadataで SwiftDataがどうschemaを作るかに 影響します @Attributeで 一意性制約を追加できます @Relationshipで inversesの選択をコントロールし delete propagation rulesを特定します これらはモデル間のリレーションシップの ビヘイビアを変えます Transient macroでSwiftDataに 特定のプロパティを 含まないよう指定できます これは以前のTripの例です 格納型プロパティにmetadataを足して SwiftDataの schema generationを調整します
nameに@Attributeを足し 一意であるべきと定義し またbucket listを@Relationshipで装飾し このtripが削除されれば 関連するすべてのbucket listを 削除するようSwiftDataに指示します SwiftData modelingについては 「Model your schema with SwiftData」をご覧ください ではあなたのmodel typesと operationを動かす 2つのkey objectsを どのように使うかお話ししましょう SwiftDataのModelContainerと ModelContextです Model containerはmodel typesの 持続的バックエンドを提供します デフォルト設定のままschemaを指定するか configurationsとmigration optionsで カスタマイズできます 保存したいmodel typesのリストを 指定するだけで model containerを作成できます さらにカスタマイズしたいなら configurationでURLや CloudKitやgroup container identifiers migration optionsを変えます Containerが用意できmodel contextsで データをfetchしsaveします またcontainerの設定にSwiftUIのviewと scene modifiersを使ってviewの環境で 自動的に依存を確立します Model contextsはmodelsへの変化を観察し 実行するactionsを提供します アップデートを探知し データをfetchし変更をsaveし それらの変更 を元に戻すインターフェイスなのです SwiftUIではたいてい model containerを作った後 viewの環境から modelContextを得るものです View階層の外でmodel containerに shared main actor bound contextを 与えるよう指示します それか単にそのmodel containerに 新しいcontextsを例示することもできます Contextが手に入ればdataをfetchできます SwiftDataはpredicateや fetch descriptotのような 新しいSwift native typesからメリットを得られ
iOS 17では predicateがnative Swift typesと働き 厳密に型指定されたconstructionに Swift macrosを使用します これは型チェックされた NSPredicateの現代的な取り替えものです AutocompleteのようにXcodeのサポートで predicatesを実行するのも簡単です これはSample Tripアプリの predicatesを作る例の一つです まずニューヨークが行き先のトリップを すべて指定できます Queryをbirthdayだけに狭めることもでき 過去の旅行ではなく 将来のトリップだけに興味があると 指定することもできます どのトリップをfetchするか決まったら FetchDescriptor typeを使って ModelContextにそれらのトリップを fetchするよう指示します FetchDescriptorと共に働く Swift SortDescriptorには native Swift typesと keypathsサポートが足されます そのSortDescriptorを使って fetchされたトリップを どのように整理したいか指示します FetchDescriptorはSwiftData queriesに さまざまな形で答えられます Predicatesとsortingに加え 関連するものをあらかじめfetchさせたり 結果を限定したり 保存されていない変更を 除外するなどできます またSwiftDataは ModelContextに作業させることで データの作成や削除そして変更が 簡単になります ほかのSwift classes同様 model objectsを作ったあと contectに挿し込み change trackingやpersistenceなど SwiftData機能を使えます Persistent objectsの削除は ModelContextに削除の印付けを 指示するのと同様に簡単です またこのような未実行の変更を ModelContextにpersistent containerへ 保存とコミットを指示し 保存することができます Model objectsの property valuesを変えるのは property settersを 普通に使うように簡単です Model macroが格納型プロパティを変更し ModelContextが自動的に 変更を記録する手助けをし 次の保存作業に含めます SwiftData containersとcontexts 及びその作業については 「Dive Deeper into SwiftData」 をご覧ください SwiftDataはSwiftUIを念頭にデザインされ 一緒に使うのは簡単です SwiftUIはSwiftDataを 使い始めるのに最も簡単な方法です SwiftData containerの設定であれ データのfetchであれ viewのアップデートであれ これらのフレームワークに 直接統合してAPIsを作成します SwiftUI sceneとview modifiersは SwiftDataアプリを最も簡単に 作成できる方法です SwiftUIでデータの保存を設定でき オプションの変更やundoや autosavingを可能にできます SwiftUIはその環境内で model contextを広く使うことができます 設定が済めば @Query property wrapperで 簡単に始められます わずか一行のコードで データベースに保存されたものを 呼び出し フィルターできます SwiftDataはObservable機能を modeled propertiesに使用できます SwiftUIはobserved propertiesを 自動的に更新します SwiftUIとSwiftDataは一緒になって 魅力のあるパワフルなアプリ作成の 助けとなります これらのフレームワークを 一緒に使うことについては 「Build an app with SwiftData」を ご覧ください
SwiftDataはデータ管理の パワフルで新しい解決策で Swiftの機能を サポートするようデザインされています あなたのコードだけに集中するため Swiftの新しいMacro systemを使用します @modelを使ってschemaを設定し model containerで persistence experienceを設定します 簡単にpersistenceにundoやredo iCloud synchronizationに ウィジェット開発などが行えます SwiftUIのシームレスな統合を利用して SwiftDataをアプリに 今すぐ取り込みましょう みなさんが何を作るか楽しみです ありがとうございました ♪ ♪
-
-
1:27 - Adding @Model to Trip
import SwiftData class Trip { var name: String var destination: String var endDate: Date var startDate: Date var bucketList: [BucketListItem]? = [] var livingAccommodation: LivingAccommodation? }
-
2:46 - Providing options for @Attribute and @Relationship
class Trip { (.unique) var name: String var destination: String var endDate: Date var startDate: Date (.cascade) var bucketList: [BucketListItem]? = [] var livingAccommodation: LivingAccommodation? }
-
3:43 - Initialize a ModelContainer
// Initialize with only a schema let container = try ModelContainer([Trip.self, LivingAccommodation.self]) // Initialize with configurations let container = try ModelContainer( for: [Trip.self, LivingAccommodation.self], configurations: ModelConfiguration(url: URL("path")) )
-
3:58 - Creating a model container in SwiftUI
import SwiftUI @main struct TripsApp: App { var body: some Scene { WindowGroup { ContentView() } .modelContainer( for: [Trip.self, LivingAccommodation.self] ) } }
-
4:20 - Accessing the environment's ModelContext
import SwiftUI struct ContextView : View { (\.modelContext) private var context }
-
5:13 - Building a predicate
let today = Date() let tripPredicate = #Predicate<Trip> { $0.destination == "New York" && $0.name.contains("birthday") && $0.startDate > today }
-
5:32 - Fetching with a FetchDescriptor
let descriptor = FetchDescriptor<Trip>(predicate: tripPredicate) let trips = try context.fetch(descriptor)
-
5:46 - Fetching with fetch and sort descriptors
let descriptor = FetchDescriptor<Trip>( sortBy: SortDescriptor(\Trip.name), predicate: tripPredicate ) let trips = try context.fetch(descriptor)
-
6:15 - Working with a ModelContext
var myTrip = Trip(name: "Birthday Trip", destination: "New York") // Insert a new trip context.insert(myTrip) // Delete an existing trip context.delete(myTrip) // Manually save changes to the context try context.save()
-
7:38 - Using @Query in SwiftUI
import SwiftUI struct ContentView: View { (sort: \.startDate, order: .reverse) var trips: [Trip] (\.modelContext) var modelContext var body: some View { NavigationStack() { List { ForEach(trips) { trip in // ... } } } } }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。