对我来说,工作代码如下:
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];
因为
CGFloat
是float
或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
或使用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/