作为一个深思熟虑(而且非常漂亮)的开发人员,我总是CGFloat
在分配float
/double
值时使用NSInteger
,NSUInteger
在处理int
/long
值时也是如此。CGFloat
不过,一直困扰着我的一件事是,当我需要从对象中解包(或NSInteger
等)值时,我不知道要请求哪种类型NSNumber
。
我可以发送 afloatValue
或doubleValue
消息来取回原始类型,但由于我使用的是CGFloat
,我不确定我需要的实际类型。我一直在想办法解决这个问题,但我的想法似乎是对看似简单的事情的相当臃肿的解决方案。
想法1:
CGFloat myFloatOrDouble = 4.5;
// I generally use boxed expressions to create NSNumber objects, so I
// don't have to choose between -numberWithFloat: or -numberWithDouble:
NSNumber *objectValue = @(myFloatOrDouble);
CGFloat scalarValue;
#if __LP64__
scalarValue = numberValue.doubleValue;
#else
scalarValue = numberValue.floatValue;
#endif
想法2:
NSNumber *objectValue = @4.5;
CGFloat scalarValue;
if ( sizeof(CGFloat) == sizeof(float) ) {
scalarValue = numberValue.floatValue;
} else {
scalarValue = numberValue.doubleValue;
}
这些只是我脑海中的一些想法,但它们似乎都比我想象的要复杂得多。
那么从对象中获取#define
d 类型的最佳方法是什么?NSNumber
这是我想太多了吗?我错过了什么吗?还是我实际上只是问了一个好问题?
任何帮助将非常感激。谢谢阅读!