【发布时间】:2013-05-23 04:46:16
【问题描述】:
我最近阅读了一些关于Key-Value Coding 的文档和一些博客文章,发现它非常有用。我想将它用于我的案例,但到目前为止我还没有成功。
就我而言,我有一个包含CGPoint 的NSMutableArray 已转换为NSValue。我将向该数据数组添加许多点,并且我想获得最小/最大 x 和 y 值。例如:
NSMutableArray *data = [[NSMutableArray alloc] init];
[data addObject:[NSValue valueWithCGPoint:CGPointMake(20.0f, 10.0f)]];
[data addObject:[NSValue valueWithCGPoint:CGPointMake(5.0f, -15.0f)]];
[data addObject:[NSValue valueWithCGPoint:CGPointMake(-5.0f, 20.0f)]];
[data addObject:[NSValue valueWithCGPoint:CGPointMake(15.0f, 30.0f)]];
// min X: -5.0, max X: 20.0
// min Y: -15.0, max Y: 30.0
到目前为止,我有两种方法。第一个是将这四个值存储在类实例变量中,当添加新对象时,将其与这些变量进行比较,并在必要时更新它们。第二种方法涉及到一个 for 循环来找到极值,但是这种方法效率低。
如果可能的话,我想使用 KVC 来完成这项任务,我相信这将是一个比我拥有的更通用的解决方案。将来,我可能还需要从数组中删除一些对象,这会使我的第一种方法不适用,剩下的就是 for 循环。
我尝试使用一些关键路径,即@"@max.x"、@"@max.position.x",但我得到的只是NSUnknownKeyException。
【问题讨论】:
-
这些关键路径从何而来?无论如何,如果您保持数组排序,那么您将有更好的时间(并且您也不需要 for 循环)。您可以通过分而治之的方式插入(从中间开始,根据值的高低选择中途,每 100 个值最多只能尝试 7 次)。
-
@borrrden,我无法对数组进行排序,因为这些数据用于绘图目的。我从documentation:
CGPoint Key Paths If the value of a given property is a CGPoint data type, you can append one of the field names in Table C-3 to the property to get or set that value. For example, to change the x component of a layer’s position property, you could write to the key path position.x.得到了keyPaths -
我的意思是“最大”的东西。那是什么?
-
@tolgamorf:如果你访问
CALayer的a的key path就可以了,但不是一般的NSValue,比较stackoverflow.com/a/15657943/1187415。 -
@borrrden 这个blog entry 对可以在关键路径中使用的简单集合运算符有很好的解释。
标签: ios objective-c kvc