Sponsor Link
環境&対象
- macOS14.5
- Xcode 16 Beta
- iOS 17.5
- Swift 5.9
PersistentIdentifier とは
SwiftData で要素を管理するために使われる Identifier です。
要素を管理するには、要素を識別できることが必要で そのために Identifier を導入することは自然です。
ですが、なぜ、Identifiable ではなく、新しい Identifier を導入したのか? が疑問でした。
ドキュメントには、型の説明として ”A type that describes the aggregate identity of a SwiftData model.” と書かれています。意訳すると ”SwiftData モデルの識別子をまとめた表現” と言えそうです。
PersistentIdentifier は、内部に以下のプロパティを持っています。
- id: PersistentIdentifier.ID
- entityName: String
- storeIdentifier: String?
id: PersistentIdentifier.ID
id は、PersistentIdentifier.ID という型を内部に持っています。
識別するために一番に必要となるのが id です。PersistentIdentifier.ID という型の詳細は公開されていません。
公開されている定義からは Hashable / Equatable / Sendable であることがわかります。
Hshable/ Equatable というのは、ID として比較等を行うために必要なプロトコルです。
Sendable であるというのは、ID をスレッドを超えて渡すことを想定するためです。
entityName: String
要素の entityName も String 形で PersistentIdentifier に保持しています。
storeIdentifier: String?
要素が属する store についても storeIdentifier として持つようになっています。
型は Optional
Store に save するまでは、storeIdentifier は、nil を保持しておくのが良さそうです。
言い方を変えると DataStore の save では、この storeIdentifier をセットすることが必要な気がします。
entityName, storeIdentifier の必要性
entityName は、PersistentIdentifier.ID が、同一 entity 内でのみ ユニークである場合を想定して、entityName も持っていると思います。
つまり、entityName を持っていることで、id が同一 entity 内でのみユニークな場合での 欲しくない一致を弾くことができます。
storeIdentifier も同じです。PersistentLayer を跨いだ id のユニーク性は保証するのが難しいと思いますので、storeIdentifier も合わせて持っていることでユニーク性を担保しているように思えます。
このように要素についてのみの id だけではなく、entityName や storeIdentifier も併せ持つことから aggegated という表現になっていると思います。
SwiftData の PersistentLayer を解放しないまま提供しているならば、id をどう振るかは Apple が決定できます。
(実際には、SQLite3 での要素への id の振り方になりますが、どのように与えるかは SwiftData 内部の問題になります)
ですので、Identifiable のまま(?) でも なんとかなったかもしれません。
しかし、PersistentLayer を Custom できるように解放したとき 「PersistentLayer は全ての要素に一意の id を振ること」や「複数の PersistentLayer を使用する場合は、要素の id は 全 PersistentLayer に渡って ユニークであること」等を要求することは難しいと考えたのではないでしょうか。
DB については詳しくないのですが、素人目にも上記の要件は、PersistentLayer にとって大変な要件に見えます。
まとめ
PersistentIdentifier の意味
- 内部に、id, entityName, storeIdentifier を持つ Identifiable な型
- Hashable,Equatable,Comparable,Codable,Sendable にも準拠
- id は、PersistentIdentifier.ID という独自型
- entityName は String 型、storeIdentifier は、String? 型
- 組み合わせて持つことで、異なる要素が 同一要素内でのみユニークな id を使用していても、identify できる
- 組み合わせて持つことで、異なる要素が 同一 Store 内でのみユニークな id を使用していても、 Identify できる
説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。
SwiftUI おすすめ本
SwiftUI を理解するには、以下の本がおすすめです。
SwiftUI ViewMatery
SwiftUI で開発していくときに、ViewやLayoutのための適切なmodifierを探すのが大変です。
英語での説明になってしまいますが、以下の”SwiftUI Views Mastery Bundle”という本がビジュアル的に確認して探せるので、便利です。
英語ではありますが、1ページに コードと画面が並んでいるので、非常にわかりやすいです。
View に適用できる modifier もわかりやすく説明されているので、ビューの理解だけではなく、どのような装飾ができるかも簡単にわかります。
超便利です
販売元のページは、こちらです。
SwiftUI 徹底入門
# SwiftUI は、毎年大きく改善されていますので、少し古くなってしまいましたが、いまでも 定番本です。
Swift学習におすすめの本
詳解Swift
Swift の学習には、詳解 Swift という書籍が、おすすめです。
著者は、Swift の初期から書籍を出していますし、Swift の前に主力言語だった Objective-C という言語についても同様の書籍を出しています。
最新版を購入するのがおすすめです。
現時点では、上記の Swift 5 に対応した第5版が最新版です。
Sponsor Link