Realm オブジェクトモデル - SwiftUI
概念: オブジェクトモデルと関係
SwiftUI のモデリング データは、Swift SDK の同じオブジェクト モデルと関係の概念上で構築されます。 Realm Swift SDK データ モデリングの概念が詳しくない場合は、「 Realm オブジェクトモデルの定義 - Swift SDK 」を参照してください。
オブジェクトモデルを UI にバインドする
モデルビューモデル(MVVM)設計パターンでは、ビューコードからモデルを抽象化するビューモデルの作成が推奨されます。 Realm を使用してそれを確実に実行できますが、Swift SDK は、SwiftUI ビューでデータを直接操作しやすくするツールを提供します。 これらのツールには、次のようなものが含まれます。
基礎となる観察可能なオブジェクトへのバインディングを作成するプロパティ ラッパー
特定のビューで使用するために基礎となるモデル オブジェクトをプロジェクションおよび変換するクラス
SwiftUI ビューのデータの変換
Realm Swift SDK は、データのサブセットを変換して操作するためのプロジェクションと呼ばれる特殊なタイプのオブジェクトを提供します。 ビュー モデルのようなプロジェクションを考えてみましょう。 これを使用すると、元のオブジェクトのプロパティをさまざまな方法で渡したり変換したりできます。
パス経由: プロジェクションのプロパティは、元のオブジェクトと同じ名前とタイプです。
名前の変更: プロジェクションのプロパティは元のオブジェクトと同じタイプですが、名前が異なります。
キーパスの解決: これを使用して、プロジェクションされたオブジェクトの特定のプロパティにアクセスします。
コレクションマッピング: 一部のコレクション タイプをプリミティブ値のコレクションにマッピングできます。
除外: プロジェクション モデルで定義されていない、元の Realm オブジェクトのすべてのプロパティ。 これらのプロパティを変更しても、プロジェクションを観察するときに変更通知はtriggerされません。
プロジェクションを使用すると、Realm のライブ オブジェクトのすべてのメリットが得られます。
クラスプロジェクションされたオブジェクトのライブアップデート
変更を観察できます
書込みトランザクション (write transaction) でプロパティに直接変更を適用できます
新しいオブジェクトの定義
オブジェクト クラスまたは 埋め込み オブジェクト クラスから派生することで、Realm オブジェクトを定義できます。クラスの名前はRealm内のテーブル名になり、クラスのプロパティはデータベースに永続します。 そのため、永続化されたオブジェクトの操作は、通常の Swift オブジェクトの操作と同様に簡単になります。
Realm SwiftUI ドキュメントでは、架空のアプリ DogoDB のモデルを使用しています。 このアプリは、犬のいる従業員の会社ディレクトリです。 これにより、従業員は犬に関するいくつかの詳細を他の従業員と共有できます。
データモデルには、その人の犬のオブジェクトとの対多の関係を持つ 人の オブジェクトが含まれています。 また、特別な Realm Swift SDK データ型( PersistableEnum )を使用して、個人のビジネス ユニットに関する情報を保存します。
class Person: Object, ObjectKeyIdentifiable { true) var _id: ObjectId (primaryKey: var firstName = "" var lastName = "" var personId = "" var company = "MongoDB" var businessUnit = BusinessUnitEnum.engineering var profileImageUrl: URL? var dogs: List<Dog> } enum BusinessUnitEnum: String, PersistableEnum, CaseIterable { case customerEngineering = "Customer Engineering" case educationCommunityAndDocs = "Education, Community and Docs" case engineering = "Engineering" case financeAndOperations = "Finance and Operations" case humanResourcesAndRescruiting = "Human Resources and Recruiting" case management = "Management" case marketing = "Marketing" case product = "Product" case sales = "Sales" } class Dog: Object, ObjectKeyIdentifiable { true) var _id: UUID (primaryKey: var name = "" var breed = "" var weight = 0 var favoriteToy = "" var profileImageUrl: URL? var dateLastUpdated = Date() "dogs") var person: LinkingObjects<Person> (originProperty: var firstLetter: String { guard let char = name.first else { return "" } return String(char) } }
プロジェクションを定義する
この架空の DogoDB アプリにはユーザー プロファイル ビューがあります。 このビューにはその人に関する一部の詳細が表示されますが、 Person
モデルのプロパティがすべて必要なわけではありません。 必要な詳細のみを含むプロジェクションを作成できます。 また、 lastName
プロパティを変更して、姓の最初の接続文字列のみを使用することもできます。
class Profile: Projection<Person> { Person.firstName) var firstName // Passthrough from original object (\ Person.lastName.localizedCapitalized.first) var lastNameInitial // Access and transform the original property (\ Person.personId) var personId (\ Person.businessUnit) var businessUnit (\ Person.profileImageUrl) var profileImageUrl (\ Person.dogs) var dogs (\}
このプロジェクションは、元のPerson
オブジェクトの代わりに、プロファイル ビューで使用できます。
クラス プロジェクションは SwiftUI プロパティ ラッパーで動作します。