2014-05-24 25 views
5

Apparentemente CGFloat è double su arm64:Handling CGFloat con una NSScanner sul arm64

#if defined(__LP64__) && __LP64__ 
# define CGFLOAT_TYPE double 
# define CGFLOAT_IS_DOUBLE 1 
# define CGFLOAT_MIN DBL_MIN 
# define CGFLOAT_MAX DBL_MAX 
#else 
# define CGFLOAT_TYPE float 
# define CGFLOAT_IS_DOUBLE 0 
# define CGFLOAT_MIN FLT_MIN 
# define CGFLOAT_MAX FLT_MAX 
#endif 

Quindi il codice

NSScanner *scanner = [NSScanner scannerWithString:string]; 
CGFloat c[components]; 
[scanner scanFloat:&c[i]] 

che stava lavorando bene per le applicazioni a 32 bit, è spezzato per 64 bit . Può essere sostituito con

NSScanner *scanner = [NSScanner scannerWithString:string]; 
CGFloat c[components]; 
#if CGFLOAT_IS_DOUBLE 
    [scanner scanDouble:&c[i]]; 
#else 
    [scanner scanFloat:&c[i]]; 
#endif 

Ma c'è un'alternativa migliore?

risposta

5

supporta solo a few basic types, quindi è necessario avere la direttiva #if da qualche parte. Detto questo, se lo usi spesso potresti creare una sottoclasse di NSScanner o usare uno category per rendere il codice più elegante.

penso che il codice di categoria a base sarebbe simile:

NSScanner + MyAdditions.h:

#import "NSScanner.h" 

@interface NSScanner (MyAdditions) 
    - (BOOL)my_scanCGFloat:(CGFloat *) cgFloatValue 
@end 

NSScanner + MyAdditions.m:

#import "NSScanner+MyAdditions.h" 

@implementation NSScanner (MyAdditions) 
    - (BOOL)my_scanCGFloat:(CGFloat *) cgFloatValue { 
#if CGFLOAT_IS_DOUBLE 
    return [self scanDouble:cgFloatValue]; 
#else 
    return [self scanFloat:cgFloatValue]; 
#endif 
} 
@end