6

その理由は、プロパティにあった正確な値を返さなければならないからです。したがって、float の場合は、-floatValue を呼び出します。しかし、それが int だった場合は、-intValue を呼び出したいと思います。

NSNumber はどのように初期化されたか覚えていますか?

4

1 に答える 1

16

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");
}
于 2011-04-24T14:05:07.077 に答える