2012-05-25 6 views
5

Ich möchte eine Entity-Eigenschaft in Core Data eine 64-Bit-Ganzzahl haben. Da das Modell unter iOS läuft, und soweit ich weiß, dass diese Geräte nicht 64-Bit sind, dachte ich, dass NSNumber der Weg zu gehen war (Kerndaten gibt Ihnen die Option von Objekten oder Skalareigenschaften für primitive Typen). Ich gehe davon aus, dass NSNumber intern kümmert sich um die Verfolgung einer geeigneten Darstellung für 64 Bits.Wie verwende ich eine Core Data Integer 64-Eigenschaft?

Nun, ich muss 1 von dieser "64 Bit" -Eigenschaft in meiner Entität zu einem bestimmten Zeitpunkt subtrahieren (falls Sie nicht raten, ist die 64-Bit-Eigenschaft der Parameter max_id in der Twitter API), aber zu tun Daher muss ich zuerst die Nummer in der NSNumber-Eigenschaft aufheben.

Also sollte ich den intValue bekommen? langWert? unsignedIntValue? unsignedLongValue? lang Lang? welcher?

Antwort

7

Da Sie bereits den Typ (64-Bit-Integer) kennen, brauchen Sie nicht für es zu überprüfen.

Um eine 64-Bit-Integer aus einem NSNumber, führen Sie einen der folgenden zu erhalten:

NSInteger myInteger = [myNSNumber integerValue]; 
int64_t myInteger = [myNSNumber integerValue]; 

Um ein bis es nur noch hinzufügen, können Sie so etwas wie diese verwenden:

myNSNumber = [NSNumber numberWithInteger:[myNSNumber integerValue]+1]]; 

Beachten Sie, dass iOS 64-Bit-Datentypen wie int64_t und NSInteger hat.

EDIT:
Wenn der einzige Grund, den Sie verwenden NSNumber die 64-Bit-Integer zu speichern, können Sie nur die Eigenschaft, wie dies in Ihrer Modellunterklasse deklarieren und das Unboxing/Boxen insgesamt überspringen:

@property (nonatomic) int64_t myIntValue; 

Beachten Sie, dass Kerndaten tut dies standardmäßig, wenn Sie die Verwendung skalaren Eigenschaften für primitive Datentypen Option des erstellen NSManagedObject Subclass Funktion auswählen.

0

Versuchen Sie dies in einer NSNumber Kategorie setzen:

-(int64_t) int64value 
{ 
    if (sizeof(short) == 8) 
     return [self shortValue]; 
    if (sizeof(int) == 8) 
     return [self intValue]; 
    if (sizeof(long) == 8) 
     return [self longValue]; 
    if (sizeof(long long) == 8) 
     return [self longLongValue]; 

    return -1; // or throw an exception 
} 
+0

Entschuldigung sagen Sie, dass es keine Möglichkeit gibt zu sagen, in welchem ​​Format ich den Wert aus der NSNumber standardmäßig erhalten sollte? Scheint keinen Sinn zu ergeben.Wenn CoreData mir sagt, dass ich eine 64-Bit-Ganzzahl in einer NSNummer speichern kann, sollte es nicht eine einfache Möglichkeit geben, 1 von dieser NSNummer zu subtrahieren, ohne sich darum zu kümmern, wie es intern dargestellt wird? – SaldaVonSchwartz

+0

[myNSNumberObject objCType]; – bbarnhart

+0

myNSManagedObject.myNSNumber.objCType löst eine EXEC_BAD_ACCESS aus ... und die Nummer wird gesetzt. Ich kann es im Debugger sehen und es auf die Konsole drucken. was gibt? – SaldaVonSchwartz

0

den C-Typ in NSNumber enthalten Um objCType verwenden

Beispiel

NSNumber *myFloat = [NSNumber numberWithFloat:5.5f]; 
NSLog(@"%s", [myFloat objCType]); 

Wird gedruckt "f", wie es ein enthält Wert des Typs float.

Überprüfen Sie auch @encode(), die ein C-Zeichen zurückgibt.

Beispiel

NSNumber *myFloat = [NSNumber numberWithFloat:5.5f]; 
if (strcmp(myFloat) == @encode(float)) { 
    NSLog(@"This is a float"); 
} 

Auch

NSNumber *myFloat = [NSNumber numberWithFloat:5.5f]; 
CFNumberType numberType = CFNumberGetType((CFNumberRef)myFloat); 
+0

@ enum? Ich denke du meintest @encode ... –

+0

Danke. Behoben. – bbarnhart