【问题标题】:Handling CGFloat with an NSScanner on arm64在 arm64 上使用 NSScanner 处理 CGFloat
【发布时间】:2014-07-13 21:57:57
【问题描述】:

显然 CGFloat 在 arm64 上是 double

#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

但是有更好的选择吗?

【问题讨论】:

    标签: cocoa-touch double nsscanner arm64 cgfloat


    【解决方案1】:

    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
    

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多