NSArray创建一个子数组,然后对数值进行求和。

问题描述 投票:1回答:1

我有一些代码,最初写成。

+(double)averageOfArray:(NSArray*)array fromIndex:(int)from toIndex:(int)to{
    if (to < 0) return 0;
    if (to > array.count) return 0;
    double sum = 0.0;
    for (long i = from; i < to; i++){
        sum += [array[i] doubleValue];
    }
    return sum/(double)(to-from);
}

但我想把它写得更有效率。我不知道这样做是否会更快,但有一个想法是创建一个子数组,然后调用 valueForKeyPath:@"sum.self" 像这样。

...
NSArray *t = [array subarrayWithRange:NSMakeRange(from, to-from)];
double sum = [[t valueForKeyPath:@"sum.self"] doubleValue];
return sum/(double)(to-from);

但这是在抛出一个错误。

线程1:异常。"[<__NSCFNumber 0xd99f8c3636814118> valueForUndefinedKey:]: 这个类的键值编码不符合键值和的要求。"

从调试器上看,显示我的 NSArray *t 作为 t = (__NSArrayl_Transfer *) @"500 elements". 但当我看到我创建的数组时,就像这样。NSArray *testArray = @[@0.1, @0.2, @0.3, @0.4 @0.5, @0.6]; 那么就会显示为 testArray = (__NSArrayl *) @"6 elements". 我假设由于某种原因,这些底层类型是问题所在。

我试着用这个方法创建一个新的数组。

NSArray *t = [[NSArray alloc] initWithArray:[array subarrayWithRange:NSMakeRange(from, to-from)] copyItems:YES];`

但这并不能解决这个问题 我有什么不明白的地方?

objective-c nsarray nspredicate nsrange
1个回答
1
投票

使用集合操作符:

当一个键路径包含一个集合运算符时,键路径中运算符前面的任何部分,即所谓的左键路径,表示相对于消息接收者而言,要在哪个集合上操作。如果您直接将消息发送到一个集合对象,比如一个集合对象。NSArray 的例子,左键路径可以省略。

操作符之后的键路径部分,称为右键路径,指定了操作符应该在集合中工作的属性。所有的集合运算符,除了 @count 需要一个正确的密钥路径。

操作员键路径格式

[email protected]
|_________________| |_________________| |_______________|

   Left key path         Operator        Right key path
  • 你是直接向一个集合对象发送消息,你可以省略左键路径。
  • 收集操作符总是以 @.
  • 需要右键路径(除了 @count).

因为你忘了用 @ 前缀,下面的代码....

double sum = [[t valueForKeyPath:@"sum.self"] doubleValue];

... 试图得到 sum 从各 NSNumber * 在数组中。然后你会得到

线程1: 异常。"[<__NSCFNumber 0xd99f8c3636814118> valueForUndefinedKey:]: 这个类的键值编码不符合键值和的要求。"

只要添加 @ 前缀到收集操作员,你就可以了。

double sum = [[t valueForKeyPath:@"@sum.self"] doubleValue];
© www.soinside.com 2019 - 2024. All rights reserved.