[SwiftData] PersistentIdentifier についてのメモ

     

TAGS:

⌛️ < 1 min.

PersistentIdentifier の持つ情報の意味を改めて考えてみたのでメモ(当たり前のことしか書いてません・・・)

環境&対象

以下の環境で動作確認を行なっています。

  • 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 という表現になっていると思います。

MEMO

SwiftData の PersistentLayer を解放しないまま提供しているならば、id をどう振るかは Apple が決定できます。
(実際には、SQLite3 での要素への id の振り方になりますが、どのように与えるかは SwiftData 内部の問題になります)
ですので、Identifiable のまま(?) でも なんとかなったかもしれません。

しかし、PersistentLayer を Custom できるように解放したとき 「PersistentLayer は全ての要素に一意の id を振ること」や「複数の PersistentLayer を使用する場合は、要素の id は 全 PersistentLayer に渡って ユニークであること」等を要求することは難しいと考えたのではないでしょうか。

DB については詳しくないのですが、素人目にも上記の要件は、PersistentLayer にとって大変な要件に見えます。

まとめ

PersistentIdentifier の意味

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 もわかりやすく説明されているので、ビューの理解だけではなく、どのような装飾ができるかも簡単にわかります。

超便利です

SwiftUIViewsMastery

販売元のページは、こちらです。

SwiftUI 徹底入門

# SwiftUI は、毎年大きく改善されていますので、少し古くなってしまいましたが、いまでも 定番本です。

Swift学習におすすめの本

詳解Swift

Swift の学習には、詳解 Swift という書籍が、おすすめです。

著者は、Swift の初期から書籍を出していますし、Swift の前に主力言語だった Objective-C という言語についても同様の書籍を出しています。

最新版を購入するのがおすすめです。

現時点では、上記の Swift 5 に対応した第5版が最新版です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です