在 arm64 上使用 NSScanner 处理 CGFloat [英] Handling CGFloat with an NSScanner on arm64

查看:21
本文介绍了在 arm64 上使用 NSScanner 处理 CGFloat的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

显然 CGFloat 在 arm64 上是 double :

Apparently CGFloat is double on 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 位应用程序中损坏.可以换成

which was working fine for 32-bit apps, is broken for 64-bit. It can be replaced with

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

但是还有更好的选择吗?

But is there a better alternative?

推荐答案

NSScanner 仅支持 一些基本类型,因此您需要在某处使用#if 指令.也就是说,如果您经常使用它,您可以继承 NSScanner 或使用 category 让代码更优雅.

NSScanner only supports a few basic types, so you're going to need to have that #if directive somewhere. That said, if you're using this often you could subclass NSScanner or use a category to make the code more elegant.

我认为基于类别的代码如下所示:

I think the category-based code would look something like:

NSScanner+MyAdditions.h:

NSScanner+MyAdditions.h:

#import "NSScanner.h"

@interface NSScanner (MyAdditions)
  - (BOOL)my_scanCGFloat:(CGFloat *) cgFloatValue
@end

NSScanner+MyAdditions.m:

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

这篇关于在 arm64 上使用 NSScanner 处理 CGFloat的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆