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)
但失败了.
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)被发送到两个数字对象.
第二,我创建的自定义类实现两个decimalValue和doubleValue,并施加@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用于添加数字.
| 归档时间: |
|
| 查看次数: |
1661 次 |
| 最近记录: |