2013-06-12 36 views
10

Czy istnieje bezpieczny sposób "przekonwertowania" CGFloat na NSNumber?NSNumber z CGFloat

NSNumber ma metody numberWithFloat: i numberWithDouble: ale CGFloat zdefiniowany jako float lub double w zależności od platformy, wydaje się ryzykowne użyć jednego z nich.

Czy można bezpiecznie używać numberWithDouble: z CGFloat, ponieważ jest to ten z większą precyzją?

+3

Jeśli masz wystarczająco dużo wersji wysokiej kompilatora, wystarczy napisać * @ (myNumber) * i zostanie on rozwiązany w czas kompilacji. Jednak możesz bezpiecznie zadzwonić * [NSNumber numberWithDouble: myNumber] *, jeśli * CGFloat * jest zdefiniowany jako podwójnie robisz to poprawnie, to * CGFloat * jest zdefiniowany jako float, ale wciąż nie straciłeś żadnej precyzji. –

+0

bezpieczne? możesz wytłumaczyć? –

+2

bezpieczne jako "bez utraty dokładności". Czy dlatego zostałem odrzucony? –

Odpowiedz

20

To jak ja sobie z nią:

@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 jest zdefiniowana w CGBase.h warunkowo przez platformę.

+0

To nawet nie jest konieczne, to jest nadmierne kodowanie. Jeśli zadzwonisz * [NSNumber numberWithDouble: value] * (dla wersji kompilatora, które nie obsługują liczb literowych), nie ryzykujesz utraty precyzji, czy liczba jest zmienna czy podwójna. –

+0

Tak, ale ty marnujesz cykle, aby przekonwertować pomiędzy float i double na platformach, gdzie CGFloat jest zmiennoprzecinkowy. Ale cokolwiek. Użyj tego, nie używaj tego. Napisałem to dawno temu i nadal go używam. Mi to pasuje. – ipmcc

+0

Thnaks @ipmcc, użyję rozwiązania Lukasa, ale twoje jest to, czego początkowo szukałem. –