Edited at

MPMediaEntityPersistentIDをCoreDataで扱いたい時の備忘録

More than 1 year has passed since last update.


MPMediaEntityPersistentIDとは

UInt64のエイリアス。


CoreDataでは

Int64型はあるがUInt64型は無い。


本題


やりたいこと

MPMediaEntityPersistentID をCoreDataのEntityのキーとして使ったりカラムに入れたりしたい。Int64の領域があれば表現の違いだけでUInt64だって入るはず。


単純なキャストを試す

let before: UInt64 = UInt64.max

let after = Int64(before)

Int64のイニシャライザに渡す際の引数がIntで定義されているので Fatal error: Not enough bits to represent a signed value が出る


結論: bit列を経由する

UInt64.max で考えると、bit列は1111...1111と1が64個並んでいる。これはInt64型では-1を表す。(bitとsigned, unsignedの数値の考え方を知らない方は「bit 整数」とかでググるとレベルアップ☆)

let before: UInt64 = UInt64.max

let after = unsafeBitCast(before, Int64.self)
print(after) // -> -1

unsafeBitCast を用いるとbit列経由で変換できるのでUInt64とInt64の行き来がデータ本来の内容を失わずに可能。

他の型を入れてもその型での表現方法など一切考慮せずbit列しか見ないので、unsafeの名前の通り理解せずに使うのは危険。


追記

そう思っていたらInt64やUInt64のイニシャライザに

let after = Int64(bitPattern: before)

こんなのがあった。どっちにしてもビット列がそのまま保存できる安心感はありがたい。