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

mde*_*erk 5 cocoa-touch objective-c ios

我的工作代码是这样的:

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

也可能

CGFloat cgf = (CGFLOAT_IS_DOUBLE) ? [n doubleValue] : [n floatValue];
Run Code Online (Sandbox Code Playgroud)

但这对我来说更加丑陋.

在我看来应该有更好的API来做这样一个普通的事情.有吗?

Mar*_*n R 12

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

 NSNumber *n = @42.42;
 CGFloat cgf = [n doubleValue];
Run Code Online (Sandbox Code Playgroud)

因为CGFloatfloat或者double.


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
Run Code Online (Sandbox Code Playgroud)

或使用C11功能"通用选择",编译器根据以下类型选择适当的代码CGFloat:

@implementation NSNumber (MyCGFloatValue)
-(CGFloat)myCGFloatValue{
    CGFloat result;
    result = _Generic(result,
            double: [self doubleValue],
            float: [self floatValue]);
    return result;
}
@end
Run Code Online (Sandbox Code Playgroud)

然后

NSNumber *n = @42.24;
CGFloat f = [n myCGFloatValue];
Run Code Online (Sandbox Code Playgroud)

但我怀疑这是值得的麻烦.