有沒有安全的方法可以將CGFloat
「轉換」爲NSNumber
?NSNumber from CGFloat
NSNumber
有numberWithFloat:
和numberWithDouble:
方法,但CGFloat
被定義爲根據不同的平臺float
或double
,似乎冒險使用其中的任何一個。
或者是numberWithDouble:
安全使用CGFloat
,因爲它是一個更精確?
有沒有安全的方法可以將CGFloat
「轉換」爲NSNumber
?NSNumber from CGFloat
NSNumber
有numberWithFloat:
和numberWithDouble:
方法,但CGFloat
被定義爲根據不同的平臺float
或double
,似乎冒險使用其中的任何一個。
或者是numberWithDouble:
安全使用CGFloat
,因爲它是一個更精確?
感謝您的解決方案和鏈接。這很有啓發性:) –
這是我如何處理它:
@interface NSNumber (CGFloatAdditions)
+ (NSNumber*)numberWithCGFloat: (CGFloat)value;
- (CGFloat)CGFloatValue;
@end
@implementation NSNumber (CGFloatAdditions)
+ (NSNumber*)numberWithCGFloat: (CGFloat)value
{
#if CGFLOAT_IS_DOUBLE
return [NSNumber numberWithDouble: (double)value];
#else
return [NSNumber numberWithFloat: value];
#endif
}
- (CGFloat)CGFloatValue
{
#if CGFLOAT_IS_DOUBLE
return [self doubleValue];
#else
return [self floatValue];
#endif
}
@end
CGFLOAT_IS_DOUBLE
在CGBase.h
有條件通過平臺定義。
這甚至不是必要的,它是過度編碼。如果您調用* [NSNumber numberWithDouble:value] *(對於不支持文字數字的編譯器版本),您不會冒失去精度的風險,無論數字是浮點還是雙精度。 –
是的,但是您在CGFloat爲浮點的平臺上浪費週期以在浮點和雙精度之間進行轉換。但是無所謂。使用這個,不要使用這個。我很久以前寫過,而且我繼續使用它。這個對我有用。 – ipmcc
Thnaks @ipmcc,我會使用Lukas的解決方案,但你的是我最初尋找的。 –
如果你有足夠高的編譯器版本,只寫* @(mynumber的)*,它會在被解析編譯時間。但是你可以安全地調用* [NSNumber numberWithDouble:myNumber] *,如果* CGFloat *被定義爲雙精度,那麼它* CGFloat *被定義爲float,你仍然沒有失去任何精度。 –
安全嗎?你可以解釋嗎? –
安全爲「沒有精確度損失」。這就是爲什麼我被低估了嗎? –