5

显然CGFloatdouble在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

但是有更好的选择吗?

4

1 回答 1

5

NSScanner只支持一些基本类型,所以你需要在某个地方有那个#if 指令。也就是说,如果您经常使用它,您可以继承 NSScanner 或使用类别来使代码更优雅。

我认为基于类别的代码看起来像:

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
于 2014-05-24T18:14:53.307 回答