2011-04-24 13 views

Respuesta

16

NSNumber tiene un número de puente gratuito con CFNumber (consulte, entre otras fuentes, el texto en la parte superior de CFNumber reference). Entonces puedes usar CFNumberGetType. P.ej.

- (void)logTypeOf:(NSNumber *)number 
{ 
    switch(CFNumberGetType((CFNumberRef)number)) 
    { 
     case kCFNumberSInt8Type: NSLog(@"8bit signed integer"); break; 
     case kCFNumberSInt16Type: NSLog(@"16bit signed integer"); break; 
     case kCFNumberSInt32Type: NSLog(@"32bit signed integer"); break; 

     /* ... etc, for all of: 
      kCFNumberSInt64Type 
      kCFNumberFloat32Type 
      kCFNumberFloat64Type 
      kCFNumberCharType 
      kCFNumberShortType 
      kCFNumberIntType 
      kCFNumberLongType 
      kCFNumberLongLongType 
      kCFNumberFloatType 
      kCFNumberDoubleType 
      kCFNumberCFIndexType 
      kCFNumberNSIntegerType 
      kCFNumberCGFloatType 
     */ 
    } 
} 

EDIT: mirando más a fondo en la documentación, CFNumberIsFloatType aparecería para hacer exactamente lo que quiere sin la complejidad. Entonces:

+0

+1 Muy bueno (y mucho mejor que el truco de conversión que se me ocurrió cuando leí el título). –

+3

Esta es una buena respuesta, sin embargo, vale la pena señalar el método 'NSNumber' [' objCType'] (http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/Reference/ Reference.html # // apple_ref/doc/uid/20000178-DontLinkElementID_7) que probablemente usa 'CFNumberGetType()'. También tenga en cuenta que tanto el método como la función tienen notas de que el tipo que devuelven puede no coincidir exactamente con el tipo de inicialización. –

Cuestiones relacionadas