objective-c - 我如何确定是否从 -valueForKey : was initially an int or float? 返回的 NSNumber

标签 objective-c foundation

原因是我必须取回属性中的确切值。所以如果它是一个 float ,我想调用 -floatValue。但如果它是一个 int,我想调用 -intValue。

NSNumber 是否记得它是如何初始化的?

最佳答案

NSNumber 是与 CFNumber 桥接的免费电话(除其他来源外,请参阅 CFNumber reference 顶部的文本)。所以你可以使用 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");
}

关于objective-c - 我如何确定是否从 -valueForKey : was initially an int or float? 返回的 NSNumber,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5770887/

相关文章:

arrays - 如何在 Swift 中拆分没有分隔符的字符串

iOS 15 警告 : NSKeyedUnarchiver _warnAboutPlistType:missingInAllowedClasses:

ios - 如何根据我的需要创建一个新的 iOS 框架?

swift - 将加号 (+) 解码为 URLComponent 中的空格

iphone - 使用自己的按钮(不是预定义的按钮)创建自己的 UI。它们是什么类型的物体?

ios - 检查我的 IOS 应用程序是否更新

ios - 由于复杂的 segue,在 Controller 之间传递数据会产生错误

iphone - performSelector :withObject:afterDelay: and dispatch_after 之间的权衡是什么

objective-c - "property is backed by an ivar"?这在技术上意味着什么?

swift - 在 swift playground 中使用 NSTimer