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)
こんなのがあった。どっちにしてもビット列がそのまま保存できる安心感はありがたい。