本文介绍了从NSNumber获取CGFloat最常见和最正确的做法是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的工作代码是:

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做这样一个普通的事情。有什么吗?

It seems to me there should be better API for doing such a common thing. Are there any?

推荐答案

在任何情况下都会得到正确的结果:

This will get the correct result in any case:

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

因为 CGFloat c> float 或 double

because CGFloat is either float or double.

NSNumber 没有 CGFloatValue 方法。您可以使用 CFNumberRef 的免费桥梁定义一个

NSNumber does not have a CGFloatValue method. You could define oneusing the toll-free bridge to 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 的类型选择适当的
代码:

or using the C11 feature "Generic selection", where the compiler chooses the appropriatecode depending on the type of 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];

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

but I doubt that it is worth the hassle.

这篇关于从NSNumber获取CGFloat最常见和最正确的做法是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-19 20:53