2014-05-24 10 views
5

Offenbar CGFloat ist double auf arm64:Handhabung CGFloat mit einem NSScanner auf 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 

So ist der Code

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

, die für 32-Bit-Anwendungen fein gearbeitet, für 64-Bit gebrochen . Es kann ersetzt werden mit

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

Aber gibt es eine bessere Alternative?

Antwort

5

NSScanner unterstützt nur a few basic types, also müssen Sie die #if-Anweisung irgendwo haben. Das heißt, wenn Sie dies häufig verwenden, können Sie NSScanner unterklassifizieren oder category verwenden, um den Code eleganter zu machen.

Ich denke, die Kategorie-basierten Code etwas aussehen würde:

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