web-dev-qa-db-ja.com

Swift Int64でCoreData Integer 64を使用する方法は?

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ビット整数を使用するには、属性をどのように定義/割り当てる必要がありますか?

12
Bouke

管理対象オブジェクトサブクラスでは、「整数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プロパティは同じ例外を引き起こします。

25
Martin R