【Swift/Realm】@Persistedプロパティラッパーとは?役割や意味
この記事からわかること
- Realm Swiftの@Persistedプロパティラッパーとは?
- 役割や意味と使い方
- @Persisted付与しないとどうなる?
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
クラスプラットフォームデータベースである「Realm」のSwift SDK(Realm Swift)で提供されている@Persistedプロパティラッパーについてまとめていきます。
@Persistedプロパティラッパーとは?
@propertyWrapper
public struct Persisted where Value : _Persistable
extension Persisted: Decodable where Value: Decodable
extension Persisted: Encodable where Value: Encodable
extension Persisted: OptionalCodingWrapper where Value: ExpressibleByNilLiteral
Realm Swiftでデータベース用のテーブルを定義する際に使用するのが@Persisted
です。
class Notification: Object ,ObjectKeyIdentifiable{
@Persisted(primaryKey: true) var id:UUID = UUID()
@Persisted var body:String
@Persisted var date:Date = Date()
}
@PersistedはRealm Swiftに用意されているプロパティラッパーの1つであり、上記のようにクラスのプロパティに付与して使用します。
「Persisted」は「持続する、残存する、継続する」と言った意味をもつ英単語であり「パーシスト」と読みます。
Realmにおける役割
@Persistedプロパティラッパーの役割は対象オブジェクトのプロパティを永続化することです。「プロパティを永続化」とはRealmデータベースのメリットである「アプリを停止後にもデータを保存し、再度起動後にデータにアクセスできること」を指します。
@Persistedを付与したプロパティのみがデータベースに格納され、付与されていないプロパティは一時的にメモリに保存されアプリが停止(オブジェクトが解放)されると消滅します。
class Notification: Object ,ObjectKeyIdentifiable{
@Persisted(primaryKey: true) var id:UUID = UUID()
@Persisted var body:String
var date:Date = Date() // これは保存されなくなる
}
自動で初期化
また@Persistedプロパティラッパーは、プロパティを自動的に初期化してくれるので初期値を設定する必要がなく、コンストラクタで初期化する必要もありません。
class Person: Object {
@Persisted var name: String
@Persisted var age: Int
@Persisted var address: String?
}
保存できる型
- Bool
- Int
- Int8
- Int16
- Int32
- Int64
- Float
- Double
- String
- Data
- Date
- ObjectId
プライマリーキーの指定
@Persistedのイニシャライザ(primaryKey:)を使用することでもプライマリーキーを設定することが可能です。
class Notification: Object ,ObjectKeyIdentifiable{
@Persisted(primaryKey: true) var id:UUID = UUID()
@Persisted var body:String
@Persisted var date:Date = Date()
}
@Persistedを付与しない場合の注意点
@Persistedを付与しないことでデータベースに保存されないことが原因で、filterメソッドが動作しなくなってしまうようです。
class Travel :Object,ObjectKeyIdentifiable {
@Persisted(primaryKey: true) var id:ObjectId
@Persisted var name:String = "
@Persisted var persistedShare:Bool = true
var share:Bool = false
}
let travelTable = realm.objects(Travel.self).filter("share == true")
発生するエラー
"Invalid keypath 'share': Property 'share' not found in object of type 'Travel'"
printメソッドで出力されない
print(travel)
クラスインスタンスをprint
メソッドで出力しようとすると@Persisted
を付与していないプロパティは表示されませんでした。
Travel {
id = 647e83deecf046e7543d728b;
name = name;
persistedShare = true;
}
インスタンスからドットシンタックスでアクセスすることは可能であり、以下のように明示的に指定すれば表示させることができました。
print(travel.share)
// false
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。