Int32.max
およびUInt32.max
より大きい整数値を格納するエンティティにCoreData属性があります。値はインデックスとして使用されるため、ルックアップのパフォーマンスが重要になります。そのため、CoreDataのデータ型としてInteger 64
を使用することを選択しました。
現在、エンティティインスタンスにInt64を格納する方法に苦労しています。私が試した次のさまざまなアプローチも参照してください。
NSNumber
を使用します:
import Foundation
import CoreData
class Node : NSManagedObject {
@NSManaged var id : NSNumber
}
node.id = Int64(1)
> 'Int64' is not convertible to 'NSNumber'
NSInteger
を使用します:
import Foundation
import CoreData
class Node : NSManagedObject {
@NSManaged var id : NSInteger
}
node.id = Int64(1)
> 'Int64' is not convertible to 'NSInteger'
Int64
を使用します:
import Foundation
import CoreData
class Node : NSManagedObject {
@NSManaged var id : Int64
}
node.id = Int64(1)
> EXC_BAD_ACCESS (code=1, address=...)
64ビット整数を使用するには、属性をどのように定義/割り当てる必要がありますか?
管理対象オブジェクトサブクラスでは、「整数64」属性をNSNumber
として定義できます。
@NSManaged var id : NSNumber
値の設定:
let value:Int64 = 20000000000000000
node.id = NSNumber(longLong: value)
値の取得:
let value:Int64 = node.id.longLongValue
ご了承ください long long
は、32ビットアーキテクチャと64ビットアーキテクチャの両方で64ビット整数です。
プロパティを次のように定義する
@NSManaged var id : Int64
// ...
node.id = Int64(...)
shouldも機能します。これは、CoreDataがプリミティブデータ型のスカラーアクセサーメソッドをサポートしているためです。 EXC_BAD_ACCESS
値を割り当てるときの例外は、Swiftコンパイラまたはランタイムのバグのように見えます。ブールプロパティの同様の問題がここに報告されています
ここで、NSNumber
プロパティは機能すると報告されていますが、スカラーBool
プロパティは同じ例外を引き起こします。