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)
因为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
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)
但我怀疑这是值得的麻烦.