A-L*_*ive 5 double cocoa-touch cgfloat nsscanner arm64
显然CGFloat是double在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
Run Code Online (Sandbox Code Playgroud)
所以代码
NSScanner *scanner = [NSScanner scannerWithString:string];
CGFloat c[components];
[scanner scanFloat:&c[i]]
Run Code Online (Sandbox Code Playgroud)
这对于32位应用程序来说效果很好,但是对于64位应用程序来说是破碎的.它可以替换为
NSScanner *scanner = [NSScanner scannerWithString:string];
CGFloat c[components];
#if CGFLOAT_IS_DOUBLE
[scanner scanDouble:&c[i]];
#else
[scanner scanFloat:&c[i]];
#endif
Run Code Online (Sandbox Code Playgroud)
但是有更好的选择吗?
小智 5
NSScanner只支持一些基本类型,所以你需要在某处拥有#if指令.也就是说,如果你经常使用它,你可以继承NSScanner或使用类别来使代码更优雅.
我认为基于类别的代码看起来像:
NSScanner + MyAdditions.h:
#import "NSScanner.h"
@interface NSScanner (MyAdditions)
- (BOOL)my_scanCGFloat:(CGFloat *) cgFloatValue
@end
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)