【问题标题】:Are there any significant benefits of wrapping a double in NSNumber?在 NSNumber 中包装一个 double 有什么显着的好处吗?
【发布时间】:2015-08-12 00:08:36
【问题描述】:

我正在编写一段代码,这些代码会根据类的配置方式进行一些繁重的数学运算。我目前在内部使用双打,因为它们为我正在做的事情提供了足够的精度。

最初,我编写的大多数方法都尽可能接受双精度数作为参数,主要是为了保持代码简洁。但是,这些相同的方法返回 NSNumber 对象,因为我使用 nil 来检查该方法是否实际返回了有效值(在某些情况下,代码可能会遇到非致命错误并返回 nil)。

所以我的典型代码如下所示:

MyMathClass *mathClass = [[MyMathClass alloc] init];

NSNumber *result = [mathClass doSomethingProfound:1234.0];

if (result == nil) {
    // handle failure gracefully
} else {
    NSLog(@"the number times 100 is %f", [result doubleValue] * 100);
}

但是,我并不完全清楚我为什么要费心将所有内容都包装在 NSNumber 类中以供返回。当时这似乎是一个好主意,但在 math.h 中挖掘让我发现了 NAN 和 isnan() 宏,我可能可以使用它们直接返回一个 double (没有中间 NSNumber 对象)并检测成功或相应地失败。

因此,我的代码将如下所示:

MyMathClass *mathClass = [[MyMathClass alloc] init];

double result = [mathClass doSomethingProfound:1234.0];

if (isnan(result)) {
    // handle failure gracefully
} else {
    NSLog(@"the number times 100 is %f", result * 100);
}

除了稍微简化一些事情并减少我要扔的对象的数量之外,编写这样依赖于 NAN 和 isnan() 来检测故障(而不是返回对象并检查为零)?

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    NSNumber 对象根本不是用来做数学的,而是用于需要将数字存储为对象的情况。例如各种集合类; NSArray, NSSet ; all 管理对象的集合,因此如果您希望将数字放入这些集合之一,请使用 NSNumber 对象。

    对于数学,只需使用普通的数字数据类型; doubleintCGFloat(一个为基本浮点类型之一定义的别名),。使用 NSNumber,您正在浪费内存、时间,甚至可能是精度(因为可能会发生类型转换)。

    HTH

    【讨论】:

      猜你喜欢
      • 2020-10-29
      • 2016-03-03
      • 2011-04-04
      • 1970-01-01
      • 2010-10-28
      • 2019-10-12
      • 1970-01-01
      • 2010-09-09
      • 2010-09-16
      相关资源
      最近更新 更多