gpt4 book ai didi

iphone - NSDecimal、NSDecimalNumber、CFNumber 之间的正确选择是什么?

转载 作者:太空狗 更新时间:2023-10-30 03:10:08 25 4
gpt4 key购买 nike

我已经阅读了很多有关 NSDecimal、NSNumber、NSNumberDecimal、CFNumber 的内容……对我来说它开始成为一种丛林。

基本上,我正在尝试创建一个简单的模型类来处理简单的计算,例如:

#import <Foundation/Foundation.h>


@interface Test : NSObject
{
float rate;
float amount;
int duration;
}

- (float)capitalizedAmount;

@end

@implementation Test

- (float)capitalizedAmount {
return (amount*pow((1.0+rate),duration));
}

@end

我想以字符串形式访问这些方法和 setter,因为我计划有很多其他类似的类,而且我只保留一个字段列表来进行键值编码。

// This is just the desired behavior
// This evidently won't work with the previous class definition
Test *obj = [[Test alloc] init];
[NSNumber numberWithInt:10]
...
float r;
r = [obj performSelector:NSSelectorFromString(@"capitalizedAmount")];

我知道这是不可能的,performSelector: 将返回一个对象,因此 capitalizedAmount 应该返回一个对象。我已经阅读了有关 NSInvocation 的内容以及 comp.lang 上的 Objective-C Faq 中的相关部分。

我也知道我应该使用 NSDecimalNumber,但是我想知道两件事:

  1. 内存开销和性能损失对于稍微复杂一些的类(仅此类财务计算,显示在 UITableView 中)是否可以接受?我在 C 方面没有太多背景......
  2. 使用像decimalNumberByAdding:这样的函数是不是太挑剔和复杂了?使用 Python 很容易定义 __add__ 以对对象使用运算符。我是否应该从 NSDecimalNumber 获取浮点值,然后进行计算并返回包含在 NSDecimalNumber 中的结果?你会如何处理这个问题?

我正在寻找一个简单而漂亮的解决方案!

同一领域的另一个问题:CFBoolean 是 iPhone Core Foundation 上 BOOL 的对象包装器吗?

非常感谢您的帮助!

最佳答案

如果您正在处理财务计算,您确实应该使用以 10 为基数的算法来避免标准以 2 为基数的浮点类型可能出现的舍入错误。所以它要么是 NSDecimal,要么是 NSDecimalNumber。由于您正在编写面向对象的代码,NSDecimalNumber 是您的正确选择。

回答你的问题:只有测试你的代码才能揭示你是否可以接受内存开销和性能损失。我并没有真正使用 NSDecimalNumber,但我敢打赌 Apple 的实现非常高效,足以满足大多数人的需求。

不幸的是,您将无法避免 decimalNumberByAdding: 之类的操作,因为 Objective-C 不像 C++ 那样支持运算符重载。我同意这会使您的代码不那么优雅。

对您发布的代码的评论:r = [obj performSelector:NSSelectorFromString(@"capitalizedAmount")]; 相当不雅。要么

r = [obj performSelector:@selector(capitalizedAmount)];

甚至是简单的

r = [obj capitalizedAmount];

会更好,除非您出于某些其他原因需要 NSSelectorFromString 语法。

关于iphone - NSDecimal、NSDecimalNumber、CFNumber 之间的正确选择是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1704504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com