2012-05-25 14 views
5

Quiero tener una propiedad Entity en Core Data ser un entero de 64 bits. Dado que el modelo se ejecutará en iOS, y hasta donde sé que estos dispositivos no son de 64 bits, calculé que NSNumber era el camino a seguir (los datos centrales le dan la opción de objetos o propiedades escalares para tipos primitivos). Supongo que NSNumber se ocupará internamente del seguimiento de una representación adecuada para 64 bits.¿Cómo se usa una propiedad Integer 64 de datos centrales?

Ahora, tengo que restar 1 de esta propiedad "64 bit" en mi entidad en algún momento (en caso de que no adivine, la propiedad de 64 bits es el parámetro max_id en la API de Twitter), pero para hacer entonces, primero necesito desempaquetar el número dentro de la propiedad NSNumber.

¿Debo obtener el intValue? ¿LongValue? unsignedIntValue? unsignedLongValue? ¿largo largo? ¿cúal?

Respuesta

7

Como usted ya sabe el tipo (entero de 64 bits), no es necesario comprobar por ello.

Para obtener un entero de 64 bits de un NSNumber, realice una de las siguientes opciones:

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

Con el fin de simplemente añadir una a ella, puede usar algo como esto:

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

Tenga en cuenta que iOS tiene tienen tipos de datos de 64 bits como int64_t y NSInteger.

EDIT:
Si la única razón por la que está utilizando NSNumber es almacenar el entero de 64 bits, sólo puede declarar la propiedad como esta en la subclase modelo y saltar el unboxing/boxeo por completo:

@property (nonatomic) int64_t myIntValue; 

Tenga en cuenta que los datos de núcleo hace esto por defecto si selecciona los Usar las propiedades escalares para los tipos de datos primitivos opción del Crear NSManagedObject Subclase función.

0

trate de poner esto en una categoría NSNumber:

-(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

lo siento, ¿estás diciendo que no hay forma de saber en qué formato debería obtener el valor del NSNumber de forma predeterminada? No parece tener sentido.Si CoreData me dice que puedo almacenar un entero de 64 bits en un NSNumber, ¿no debería haber una manera simple de restar 1 de ese NSNumber sin preocuparme de cómo se representa internamente? – SaldaVonSchwartz

+0

[myNSNumberObject objCType]; – bbarnhart

+0

myNSManagedObject.myNSNumber.objCType arroja un EXEC_BAD_ACCESS ... y se establece el número. Puedo verlo en el depurador e imprimirlo en la consola. ¿lo que da? – SaldaVonSchwartz

0

para obtener el tipo C contenida en NSNumber utilizar objCType

Ejemplo

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

imprimirá "f" ya que contiene una valor de tipo flotante.

Además, consulte @encode() que devolverá un carácter de tipo C.

Ejemplo

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

también

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

@enum? Creo que quisiste decir @encode ... –

+0

Gracias. Arreglado. – bbarnhart

Cuestiones relacionadas