2014-05-24 73 views
5

顯然CGFloat處理CGFloat的與NSScanner是double上arm64:上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 

因此,代碼

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

其工作正常的32位應用程序,被分解爲64位。它可以替換爲

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

但是有沒有更好的選擇?

回答

5

NSScanner只支持a few basic types,所以你需要在那裏有#if指令。也就是說,如果你經常使用這個,你可以繼承NSScanner或使用category來使代碼更優雅。

我認爲基於類別的代碼看起來是這樣的:

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