LoginSignup
0
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-08-21

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)

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0