🪶

Swift Identifiable

2024/07/24に公開

What is Identifiable?

Swiftで、Identifiableと書くことあるのですが、どんな意味だったかなと思い出せなかった😇
モデルクラスでよく使われてますね。

公式を読んでみることにした

Identifiable
A class of types whose instances hold the value of an entity with stable identity.

識別可能
安定した同一性を持つ実体の値をインスタンスに持つ型のクラス。

「識別するのか...」

概要

Identifiable プロトコルを使用すると、クラスや値型に安定した ID の概念を提供できます。例えば、アプリやアプリのデータベースストレージ全体で安定したidプロパティを持つUser型を定義することができます。ユーザーの名前など、他のデータフィールドが変更されても、idプロパティを使用して特定のユーザーを識別できます。

Identifiable は、ID の有効期間とスコープを不特定のままにします。ID は、以下のいずれかの特性を持つことができます:

  • UUIDのように、常に一意であることが保証されている。
  • データベースのレコードキーのように、環境ごとに永続的に一意である。
  • グローバルインクリメント整数のように、プロセスの有効期間中一意である。
  • オブジェクト識別子のように、オブジェクトの寿命の間一意である。
  • コレクションインデックスのように、現在のコレクション内で一意。

IDの性質を文書化するのは、プロトコルの適合者と受信者の両方にかかっている。

識別可能なプロトコルに準拠

Identifiableは、(ObjectIdentifierを使用した)クラス・タイプのデフォルト実装を提供します。オブジェクトがより強力な ID の概念を持っている場合、カスタム実装を提供することが適切な場合があります。

こちらの海外のサイトが参考になりそう

struct ExpenseItem: Identifiable {
    let id = UUID()
    let name: String
    let type: String
    let amount: Double
}

⚙️内部実装のコード

/// A class of types whose instances hold the value of an entity with stable
/// identity.
///
/// Use the Identifiable protocol to provide a stable notion of identity to a
/// class or value type. For example, you could define a User type with an id
/// property that is stable across your app and your app's database storage.
/// You could use the id property to identify a particular user even if other
/// data fields change, such as the user's name.
///
/// Identifiable leaves the duration and scope of the identity unspecified.
/// Identities can have any of the following characteristics:
///
/// - Guaranteed always unique, like UUIDs.
/// - Persistently unique per environment, like database record keys.
/// - Unique for the lifetime of a process, like global incrementing integers.
/// - Unique for the lifetime of an object, like object identifiers.
/// - Unique within the current collection, like collection indices.
///
/// It's up to both the conformer and the receiver of the protocol to document
/// the nature of the identity.
///
/// Conforming to the Identifiable Protocol
/// =======================================
///
/// Identifiable provides a default implementation for class types (using
/// ObjectIdentifier), which is only guaranteed to remain unique for the
/// lifetime of an object. If an object has a stronger notion of identity, it
/// may be appropriate to provide a custom implementation.

/// インスタンスが安定したエンティティの値を保持する型のクラス。
/// アイデンティティを持つ。
///
/// クラスや値型に安定した同一性の概念を提供するために Identifiable プロトコルを使用する。
/// クラスや値の型にアイデンティティの安定した概念を提供するために Identifiable プロトコルを使用する。例えば、 id プロパティを持つ User 型を定義することができる。
/// プロパティを持つ User 型を定義することができます。
/// 他のデータフィールドが変更されても、id プロパティを使用して特定のユーザーを識別することができます。
/// ユーザーの名前など、他のデータフィールドが変更された場合でも、id プロパティを使用して特定のユーザーを識別することができます。
///
/// Identifiable は ID の有効期間とスコープを不特定のままにする。
/// ID は以下のいずれかの特性を持つことができる:
///
/// UUID のように常に一意であることが保証されている。
/// データベースのレコードキーのように、環境ごとに永続的に一意である。
/// グローバルインクリメント整数のように、プロセスの有効期間中一意である。
/// - オブジェクト識別子のように、オブジェクトの存続期間中一意である。
/// - コレクションインデックスのように、現在のコレクション内で一意。
///
/// プロトコルの適合者と受信者の両方が、以下のことを文書化する。
/// ID の性質を文書化するのは、適合者とプロトコルの受信者の両方である。
///
/// 識別可能なプロトコルへの準拠
/// =======================================
///
/// Identifiable は、クラス型のデフォルトの実装を提供する (/// ObjectIdentifiable を使用する)。
/// ObjectIdentifier を使用)、これはオブジェクトの寿命の間だけ一意であることが保証されます。
/// オブジェクトの寿命の間だけ一意であることが保証される。オブジェクトがより強い同一性の概念を持っている場合、 /// objectIdentifier` を提供することが適切かもしれない。
/// カスタム実装を提供するのが適切かもしれない。

まとめ

Identifiableは、プロトコルのようです。Identifiableに準拠させることで、特定のIDを使いどのデータなのか特定して、扱うことができるようになります。SwiftDataで使う場面がありました。

SwiftDataの記事

Discussion