2014-06-22 21 views
9

Ho un attributo CoreData su un'entità su cui voglio memorizzare valori interi maggiori di Int32.max e UInt32.max. Il valore viene utilizzato come indice, quindi le prestazioni di ricerca sono importanti. Quindi ho deciso di utilizzare Integer 64 come tipo di dati in CoreData.Come utilizzare Core Data Integer 64 con Swift Int64?

Ora sto cercando di memorizzare un Int64 nella mia istanza di entità. Vedi anche i seguenti diversi approcci che ho provato.

Uso NSNumber:

import Foundation 
import CoreData 

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

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

Uso NSInteger:

import Foundation 
import CoreData 

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

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

Uso Int64:

import Foundation 
import CoreData 

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

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

Come dovrebbe essere definito l'attributo/assegnato al fine di utilizzare interi a 64 bit?

risposta

21

È possibile definire l'attributo "Integer 64" come NSNumber nella sottoclasse oggetto gestito:

@NSManaged var id : NSNumber 

impostazione di un valore:

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

recuperare il valore:

let value:Int64 = node.id.longLongValue 

Si noti che long long è un numero intero a 64 bit su entrambi i 32-bit e 64- architettura bit.


Definire la proprietà come

@NSManaged var id : Int64 

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

dovrebbe lavorano anche, perché Core Data supporta metodi di accesso scalari per primitive tipi di dati. L'eccezione EXC_BAD_ACCESS quando si assegna un valore mi appare come come un errore nel compilatore o nel runtime Swift. Un problema simile per una proprietà booleana è riportato qui

in cui una proprietà NSNumber si dice funzioni, ma lo scalare Bool proprietà fa sì che la stessa eccezione.

+0

Utilizzando la soluzione proposta 'NSNumber (longLong: value)' ha funzionato. Sono d'accordo con te sul fatto che quest'ultimo è probabilmente un bug in Swift. – bouke

+1

Il problema con Int64 che causa trap su architetture a 32 bit (18113807) è stato corretto in Xcode 6.1 beta. – bouke