Как я могу выяснить, если NSNumber, который я получаю от -valueForKey: изначально был int или float? - PullRequest
6 голосов
/ 24 апреля 2011

Причина в том, что я должен вернуть точное значение, как оно было в собственности.Так что, если это был float, я хочу вызвать -floatValue.Но если это int, я хочу вызвать -intValue.

Запоминает ли NSNumber, как он был инициализирован?

1 Ответ

16 голосов
/ 24 апреля 2011

NSNumber является бесплатным по мосту с CFNumber (см., Среди других источников, текст в верхней части CFNumber ссылка ). Таким образом, вы можете использовать CFNumberGetType . Э.Г.

- (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
        */
   }
}

РЕДАКТИРОВАТЬ: более тщательно взглянув на документацию, CFNumberIsFloatType , по-видимому, будет выполнять именно то, что вы хотите, без сложности. Итак:

if(CFNumberIsFloatType((CFNumberRef)number))
{
    NSLog(@"this was a float");
}
else
{
    NSLog(@"this was an int");
}
...