2013-06-12 24 views
10

Esiste un modo sicuro per "convertire" un CGFloat in un NSNumber?NSNumero da CGFloat

NSNumber ha le numberWithFloat: e numberWithDouble: metodi ma CGFloat essendo definita come float o double seconda della piattaforma, sembra rischioso usare uno di loro.

Oppure è numberWithDouble: sicuro da utilizzare con uno CGFloat, poiché è quello con la precisione maggiore?

+3

Se si dispone di una versione abbastanza alto compilatore, basta scrivere * @ (myNumber) * e sarà risolto a compilare il tempo. Comunque puoi tranquillamente chiamare * [NSNumber numberWithDouble: myNumber] *, se * CGFloat * è definito come double lo fai correttamente, * CGFloat * è definito come float che non hai ancora perso precisione. –

+0

sicuro? Puoi spiegare? –

+2

sicuro come "senza perdita di precisione". È per questo che sono stato downvoted? –

risposta

20

Ecco come ho gestito è:

@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 è definito in CGBase.h condizionalmente dalla piattaforma.

+0

Questo non è nemmeno necessario, è un eccesso di codice. Se si chiama * [NSNumber numberWithDouble: value] * (per le versioni del compilatore che non supportano i numeri letterali) non si rischia di perdere precisione se il numero è float o double. –

+0

Sì, ma si sprecano cicli per convertire tra float e double su piattaforme in cui CGFloat è un float. Ma comunque. Usa questo, non usare questo. L'ho scritto molto tempo fa e continuo a usarlo. Per me funziona. – ipmcc

+0

Thnaks @ipmcc, userò la soluzione di Lukas ma il tuo è quello che cercavo in origine. –