cocoa-touch - 在 arm64 上使用 NSScanner 处理 CGFloat

标签 cocoa-touch double nsscanner arm64 cgfloat

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

但是有更好的选择吗?

最佳答案

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

关于cocoa-touch - 在 arm64 上使用 NSScanner 处理 CGFloat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23847896/

相关文章:

iphone - 多线程和 “just leaking”警告

ios - 删除 iOS 应用本地化

ios - 解析多种日期格式

iphone - 我真的需要 MainWindow.xib 文件吗?

java - 精度损失 - int -> float 或 double

ubuntu - 在 ubuntu 14.04 服务器下,双数乘法在 Grails 中不起作用

java - android中的指数函数

ios - NSString 删除重复的子串

iphone - NSScanner 在简单删除空格时的奇怪行为

objective-c - 如何在 XCode 中使用调试器检查变量的值