【Swift】RealmでObjectIdクラスの使い方!一意のID生成とString型変換
この記事からわかること
- Realm Swiftで一意のIDを生成する方法
- ObjectIdクラスの使い方
- String型と相互に型変換(キャスト)するには?
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
参考文献: ObjectId Class Reference
モバイル向けのデータベースを提供しているRealm Swiftの中でObjectIdクラスの使い方をまとめていきます。
ObjectIdクラスとは
public final class ObjectId: RLMObjectId, Decodable, @unchecked Sendable
ObjectId
クラスは12バイトの一意の英数字の羅列を自動で生成するクラスです。完全にランダムなわけではなく、生成された識別子にソートをかけると生成された順番に整列されるように割り振られます。
Foundation
フレームワークに定義済みのUUID
構造体と基本的な役割は同じです。
おすすめ記事:UUIDとは?
一意のidを生成する方法
ObjectId
クラスを使用して一意のIDを生成するにはテーブルクラスの定義の際に、ObjectId
にします。初期期を格納しなくてもインスタンス生成時に自動で生成してくれるので気にする必要はありません。
class User: Object {
@Persisted(primaryKey: true) var id: ObjectId
@Persisted var name:String = ""
@Persisted var age:Int = 0
}
Results<User> <0x12d605990> (
[0] User {
id = 6332fc79008dcaf2c0135526;
name = ame;
age = 230;
},
[1] User {
id = 6332ff27131e9c4275156b67;
name = ame;
age = 230;
}
)
インスタンスを普通に作成する
クラスのプロパティとしてではなく、普通にインスタンス化した際に一意のIDを生成するにはgenerate
メソッドもしくはinit(timestamp:machineId:processId:)
を使用します。
let objectId = ObjectId.generate()
print(objectId) // 647446c4ada430885455c5cf
let objectId2 = ObjectId(timestamp: Date(), machineId: 0, processId: 0)
print(objectId2) // 647446c4010000000055c5ce
timestamp
には適当なData型をmachineId
とprocessId
にはInt型で数値を渡すことで生成されるIDが変化します。
シンプルなイニシャライザ(init())を使用してインスタンス化しても一意のIDは生成されないので注意してください。
let objectId = ObjectId()
print(objectId) // 000000000000000000000000
String(文字列)型を取得する
ObjectId
型ではなく、String(文字列)型として取得したい場合はstringValue
プロパティを使用します。
let objectId = ObjectId.generate()
let objectIdString = objectId.stringValue
String(文字列)型をObjectId型にキャストする
public override required init(string: String) throws
String
(文字列)型からObjectId
型にキャストしたい場合はObjectId(string:)
形式のイニシャライザを使用します。throws
がついているのでtry
を使用します。
let objectIdString = "6332ff27131e9c4275156b67"
let objectId = try? ObjectId(string: objectIdString)
失敗する場合は文字列が24文字でない場合または「0-9a-fA-F」以外の文字が含まれている場合です。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。