2013-06-12 30 views
10

有沒有安全的方法可以將CGFloat「轉換」爲NSNumberNSNumber from CGFloat

NSNumbernumberWithFloat:numberWithDouble:方法,但CGFloat被定義爲根據不同的平臺floatdouble,似乎冒險使用其中的任何一個。

或者是numberWithDouble:安全使用CGFloat,因爲它是一個更精確?

+3

如果你有足夠高的編譯器版本,只寫* @(mynumber的)*,它會在被解析編譯時間。但是你可以安全地調用* [NSNumber numberWithDouble:myNumber] *,如果* CGFloat *被定義爲雙精度,那麼它* CGFloat *被定義爲float,你仍然沒有失去任何精度。 –

+0

安全嗎?你可以解釋嗎? –

+2

安全爲「沒有精確度損失」。這就是爲什麼我被低估了嗎? –

回答

20

這是我如何處理它:

@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_DOUBLECGBase.h有條件通過平臺定義。

+0

這甚至不是必要的,它是過度編碼。如果您調用* [NSNumber numberWithDouble:value] *(對於不支持文字數字的編譯器版本),您不會冒失去精度的風險,無論數字是浮點還是雙精度。 –

+0

是的,但是您在CGFloat爲浮點的平臺上浪費週期以在浮點和雙精度之間進行轉換。但是無所謂。使用這個,不要使用這個。我很久以前寫過,而且我繼續使用它。這個對我有用。 – ipmcc

+0

Thnaks @ipmcc,我會使用Lukas的解決方案,但你的是我最初尋找的。 –