使用valueForKeyPath查找NSMutableArray的平均值

Ton*_*ite 5 average objective-c nsmutablearray ios

目前我正试图找到一种平均矩阵的简洁方法.显而易见的解决方案是对矩阵求和,然后除以元素的数量.但是,我在苹果开发者网站上遇到了一种方法,声称可以使用valueForKeyPath以更简单的方式完成此操作.这与以下内容相关联:

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueCoding/Articles/CollectionOperators.html

以下是我正在努力尝试使其工作的示例:

-(void)arrayAverager
{
   NSMutableArray *myArray = [NSMutableArray arrayWithCapacity:25];
   [myArray addObject:[NSNumber numberWithInteger:myValue]];
   NSNumber *averageValue = [myArray valueForKeyPath:@"@avg.self"];
   NSLog(@"avg  = %@", averageValue);

} 
Run Code Online (Sandbox Code Playgroud)

问题是:代替平均它仅通过1打印出阵列1中的元素阵列.

UPDATE

-(void) pixelAverager

{
    //Put x-coordinate value of all wanted pixels into an array
    NSMutableArray *xCoordinateArray = [NSMutableArray arrayWithCapacity:25];
    [xCoordinateArray addObject:[NSNumber numberWithInteger:xCoordinate]];
    NSLog(@"avg = %@", [xCoordinateArray valueForKeyPath:@"@avg.intValue"]);
 }
Run Code Online (Sandbox Code Playgroud)

fre*_*ace 18

你需要使用@avg.floatValue(@avg.doubleValue或者你有什么).该@avg运营商将平均点后由name指定数组中的对象的属性.文档在这一点上令人困惑,但这就是:

获取由运算符右侧的键路径指定的属性指定的值

在说.由于您有一组NSNumber对象,因此您可以使用其中一个*value访问器,例如floatValue获取每个对象的值.举个例子:

#include <Foundation/Foundation.h>

int main(void) {
  NSMutableArray *ma = [NSMutableArray array];
  [ma addObject:[NSNumber numberWithFloat:1.0]];
  [ma addObject:[NSNumber numberWithFloat:2.0]];
  [ma addObject:[NSNumber numberWithFloat:3.0]];

  NSLog(@"avg = %@", [ma valueForKeyPath:@"@avg.floatValue"]);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译并运行此代码将返回:

$ clang avg.m -framework Foundation -o avg
steve:~/code/tmp
$ ./avg 
2013-01-18 12:33:15.500 avg[32190:707] avg = 2
steve:~/code/tmp
Run Code Online (Sandbox Code Playgroud)

关于这种方法的好处是,只要所有对象都响应指定的方法,任何集合,同源或其他的@avg工作都可以工作.

编辑

正如评论中所指出的,OP的问题在于他使用一个元素对集合进行平均,因此它似乎只是打印集合的内容.对于一组NSNumber对象,@avg.self工作得很好.