2014-06-22 11 views
9

Ich habe ein CoreData-Attribut für eine Entität, auf der ich ganzzahlige Werte speichern möchte, die größer sind als Int32.max und UInt32.max. Der Wert wird als Index verwendet, daher ist die Nachschlageleistung wichtig. Also habe ich mich entschieden, Integer 64 als Datentyp in CoreData zu verwenden.Wie verwendet man Core Data Integer 64 mit Swift Int64?

Jetzt habe ich Probleme, wie ich ein Int64 auf meiner Entity-Instanz speichern kann. Siehe auch die folgenden verschiedenen Ansätze, die ich ausprobiert habe.

Verwendung NSNumber:

import Foundation 
import CoreData 

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

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

Verwendung NSInteger:

import Foundation 
import CoreData 

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

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

Verwendung Int64:

import Foundation 
import CoreData 

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

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

Wie sollte das Attribut, um 64-Bit-Integer verwenden definiert/zugewiesen werden?

Antwort

21

Sie können die "Integer 64" Attribut als NSNumber in der verwalteten Objektunterklasse definieren:

@NSManaged var id : NSNumber 

Wert einstellen:

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

den Wert abrufen:

let value:Int64 = node.id.longLongValue 

Beachten Sie, dass long long eine 64-Bit-Ganzzahl auf der 32-Bit- und der 64-Bit-Ganzzahl ist. Bit-Architektur.


Definition der Eigenschaft als

@NSManaged var id : Int64 

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

sollte auch funktionieren, weil Core Data Skalar Accessormethoden für primitive Datentypen unterstützt. Die EXC_BAD_ACCESS Ausnahme bei der Zuweisung eines Wertes sieht für mich wie ein Fehler im Swift-Compiler oder der Laufzeit aus. Ein ähnliches Problem für eine Boolesche Eigenschaft wird hier berichtet

wo eine NSNumber Eigenschaft gemeldet zu arbeiten, aber die skalare Bool Eigenschaft die gleiche Ausnahme verursacht.

+0

Mit Ihrer vorgeschlagenen Workaround 'NSNumber (longLong: Wert)' gearbeitet. Ich stimme Ihnen zu, dass letzteres wahrscheinlich ein Fehler in Swift ist. – bouke

+1

Das Problem mit Int64, das Traps auf 32-Bit-Architekturen verursacht (18113807), wurde in Xcode 6.1 Beta behoben. – bouke