ios - 从NSNumber获取CGFloat的最常见和正确的做法是什么?

标签 ios objective-c cocoa-touch

对我来说,工作代码如下:

NSNumber *n = @42.42;
CGFloat cgf = 0; 
CFNumberRef cfn = CFBridgingRetain(n);
CFNumberGetValue(cfn, kCFNumberCGFloatType, &cgf);
CFRelease(cfn);

可能还有
CGFloat cgf = (CGFLOAT_IS_DOUBLE) ? [n doubleValue] : [n floatValue];

但这对我来说更难闻。

在我看来,应该有更好的API来执行这样的常规操作。有吗

最佳答案

无论如何,这将得到正确的结果:

 NSNumber *n = @42.42;
 CGFloat cgf = [n doubleValue];

因为CGFloatfloatdouble
NSNumber没有CGFloatValue方法。您可以定义一个
使用通往CFNumberRef的免费电话桥:
@interface NSNumber (MyCGFloatValue)
-(CGFloat)myCGFloatValue;
@end

@implementation NSNumber (MyCGFloatValue)
-(CGFloat)myCGFloatValue{
    CGFloat result;
    CFNumberGetValue((__bridge CFNumberRef)(self), kCFNumberCGFloatType, &result);
    return result;
}
@end

或使用C11功能“常规选择”,由编译器选择适当的
代码取决于CGFloat的类型:
@implementation NSNumber (MyCGFloatValue)
-(CGFloat)myCGFloatValue{
    CGFloat result;
    result = _Generic(result,
            double: [self doubleValue],
            float: [self floatValue]);
    return result;
}
@end

然后
NSNumber *n = @42.24;
CGFloat f = [n myCGFloatValue];

但我怀疑是否值得麻烦。

关于ios - 从NSNumber获取CGFloat的最常见和正确的做法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23809055/

相关文章:

ios - 在 Xcode 中,将 UIButtons 设置为相同的宽度,除非它们截断了文本标签

objective-c - MKNetworkKit 和 GCD dispatch_group_t

ios - 在 xcode 中实现登录屏幕后滑出菜单栏

objective-c - 混合两个图像并从两个 UIImageViews 绘制调整大小的图像

ios - 检查 tintColor 是否在 tintColorDidChange 中变暗

ios - 有没有办法在注释 View 层中设置 z-order?

php mysql emoji 双字符

ios - 如何使用响应写入特性值并读取响应 BLE

objective-c - 在后台线程上加载 Nib

iphone - 如何在 Notes iPad 应用程序中重新创建动画?