我有一些代码,最初写成。
+(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];`
但这并不能解决这个问题 我有什么不明白的地方?
当一个键路径包含一个集合运算符时,键路径中运算符前面的任何部分,即所谓的左键路径,表示相对于消息接收者而言,要在哪个集合上操作。如果您直接将消息发送到一个集合对象,比如一个集合对象。
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];