如何在NSMutableArray中添加所有十进制数

Dan*_*hen 1 objective-c nsarray nsdecimalnumber

我有NSMutableArray一些其中有一些NSDecimalNumber,比如(500,50.80,70,8000)

现在我想把所有这些加decimal numbers在一起.

我试过用

for (NSDecimalNumber *number in self.numbersArray)
{
    NSDecimal *sum += [number decimalValue]
}
Run Code Online (Sandbox Code Playgroud)

但失败了.

Mar*_*n R 5

NSNumber在数组中添加所有s的简单方法是(类似于@Mahonor在评论中所说的):

NSArray *myArray = ... // array of NSNumber (or NSDecimalNumber) objects
NSNumber *sum = [myArray valueForKeyPath:@"@sum.self"];
Run Code Online (Sandbox Code Playgroud)

集合运算符相反:总和状态,数组中的数字不会转换为double,而是转换为NSDecimal.因此,添加十进制数时不会丢失精度.即使NSNumber是非十进制数的对象也会转换NSDecimal为添加.求和的结果是一个实例NSDecimalValue.

我以两种不同的方式验证(或尝试过).首先,我运行了这段代码

NSNumber *a = [NSNumber numberWithDouble:1.2];
NSNumber *b = [NSDecimalNumber decimalNumberWithString:@"-5.7"];
NSArray *myArray = @[a, b];
id sum = [myArray valueForKeyPath:@"@sum.self"];
Run Code Online (Sandbox Code Playgroud)

并通过设置环境变量"NSObjCMessageLoggingEnabled = YES"激活Objective-C消息日志记录.从创建的"/ tmp/msgSends-NNNN"文件中可以看出,decimalNumber(并且没有doubleValue)被发送到两个数字对象.

第二,我创建的自定义类实现两个decimalValuedoubleValue,并施加@sum.self到自定义类的对象的数组:

@interface MyClass : NSObject
@property (nonatomic, assign) double value;
@end

@implementation MyClass

- (NSDecimal)decimalValue
{
    return [[NSNumber numberWithDouble:self.value] decimalValue];
}

- (double)doubleValue
{
    return self.value;
}

@end

MyClass *a = [MyClass new]; a.value = 1.2;
MyClass *b = [MyClass new]; b.value = -5.7;
NSArray *myArray = @[a, b];
id sum = [myArray valueForKeyPath:@"@sum.self"];
Run Code Online (Sandbox Code Playgroud)

通过在两种方法中设置断点,可以看出只decimalValue用于求和(valueForKeyPath:@"@sum.self"如果类没有实现则抛出异常decimalValue).

人们也可以看到decimalValue从中调用

-[NSArray(NSKeyValueCoding) _sumForKeyPath:]
Run Code Online (Sandbox Code Playgroud)

并且此方法的汇编代码显示NSDecimalAdd用于添加数字.