2014-06-22 1 views
9

Int32.maxUInt32.max보다 큰 정수 값을 저장하려는 엔티티에 CoreData 특성이 있습니다. 이 값은 색인으로 사용되므로 조회 성능이 중요합니다. 따라서 CoreData에서 데이터 유형으로 Integer 64을 사용하기로했습니다.Swift Int64와 함께 Core Data Integer 64를 사용하는 방법?

이제 엔티티 인스턴스에 Int64를 저장하는 방법에 대해 고심하고 있습니다. 내가 시도한 다음과 같은 다른 접근 방식을 참조하십시오.

사용 NSNumber : NSInteger

import Foundation 
import CoreData 

class Node : NSManagedObject { 
    @NSManaged var id : NSNumber 
} 

node.id = Int64(1) 
> 'Int64' is not convertible to 'NSNumber' 

사용 : Int64

import Foundation 
import CoreData 

class Node : NSManagedObject { 
    @NSManaged var id : NSInteger 
} 

node.id = Int64(1) 
> 'Int64' is not convertible to 'NSInteger' 

사용 :

import Foundation 
import CoreData 

class Node : NSManagedObject { 
    @NSManaged var id : Int64 
} 

node.id = Int64(1) 
> EXC_BAD_ACCESS (code=1, address=...) 

속성이 정의되어야한다 방법/64 개 비트 정수를 사용하기 위해 할당?

답변

21

할 수 있습니다 관리 객체의 하위 클래스에서 NSNumber로 "정수 (64)"속성을 정의

@NSManaged var id : NSNumber 

값 설정 :

let value:Int64 = node.id.longLongValue 

: 값을 가져

let value:Int64 = 20000000000000000 
node.id = NSNumber(longLong: value) 

long long은 32 비트 및 64 비트 정수 모두에서 64 비트 정수입니다. bit 아키텍처. 코어 데이터 프리미티브 데이터 유형 스칼라 접근 방식을 지원하므로 속성 정의


같은
@NSManaged var id : Int64 

// ... 
node.id = Int64(...) 

해야 또한 작동한다. 값을 지정할 때 EXC_BAD_ACCESS 예외는 나를 Swift 컴파일러 나 런타임의 버그처럼 보입니다. 부울 특성 에 비슷한 문제가 여기

보고 있지만, 스칼라 Bool 속성은 같은 예외가 발생 .

+0

제안 된 해결 방법을 사용하면 NSNumber (longLong : value)가 작동합니다. 후자는 아마도 Swift의 버그 일 것입니다. – bouke

+1

Int64가 32 비트 아키텍처에서 트랩을 발생시키는 문제 (18113807)가 Xcode 6.1 베타에서 수정되었습니다. – bouke