4

我在 NSArray 中有一个 NSArray ,所以:

@[
    @[ @1, @2, @3 ],
    @[ @7, @6 ]
 ]

如何使用该方法valueForKeyPath:获取每个数组中的项目数,所以:

@[ @3, @2 ]

我已经尝试过,但这提供了与(so 2)[array valueForKeyPath:@"@count"]相同的答案。[array count][array valueForKeyPath:@"count"]

4

2 回答 2

11

结合使用@unionOfObjects@countKVC 集合运算符:

NSArray *counts = [array valueForKeyPath:@"@unionOfObjects.@count"];

counts在这种情况下记录会产生:

counts = (
    3,
    2
)

实例上的调用valueForKey:及其变体NSArray通常用于返回一个数组,该数组由调用valueForKey:接收器中每个元素的结果形成。因此,[array valueForKey:@"count"]不会返回由返回的值,-[NSArray count]而是会调用valueForKey:@"count"其每个元素。嵌套在其他数组中的数组不会有任何不同,因此我们不能@"count"直接将其用作我们的关键路径,因为它会尝试将该计算委托给它的每个元素。使用@"@count"as key path 也不起作用,因为它在其左侧的 key 上操作,valueForKeyPath:当没有指定其他 key path 时,暗示它是方法的接收者。

我们需要的是一种方法来指定@count运算符不应该计算封闭数组而是计算其中的元素。在我们的关键路径中使用@unionOfObjects集合操作符可以实现这一点。如果我们有一个关键路径,例如:

@unionOfObjects.$COLLECTION.$REST_OF_KEYPATH

然后返回的结果将是由作为参数发送消息的每个元素的结果形成$COLLECTIONvalueForKeyPath:数组$REST_OF_KEYPATH。最后一个事实 - 当valueForKeyPath:消息的接收者本身是一个集合时,$COLLECTION可以在 key path 中使用 string 指定self

因此,我们的关键路径应如下所示:

@"@unionOfObjects.self.@count"

这指定将返回一个数组,其中每个元素都是发送-valueForKeyPath:@"@count"到接收器中每个元素的结果。最后,我不确定这样做是否可取,但似乎 self 可以完全从密钥路径中删除,只要@unionOfObjects操作员不是密钥路径的唯一组成部分。在这种情况下,它替代@unionOfObjects.$COLLECTION了密钥路径的组件。

于 2013-10-29T04:04:15.920 回答
-1

我不确定你想如何“获取”每个数组中的项目数(即返回一个值,或者只是将它记录到控制台)。另外,如果您只想要每个子数组中的项目数,valueForKeyPath:则不是要调用的消息...

我将假设您只想知道数组中每个子数组的计数。

您可以使用 for 循环遍历每个条目myArray并将count消息发送到每个条目。

NSArray *myArray = @[ 
                      @[@1, @2, @3], 
                      @[@7, @6]
                   ];

for (NSArray *entry in myArray) {
    NSLog(@"array at index %lu has count %lu", [myArray indexOfObject:entry], [entry count]);  
}

更进一步,您可以将它们存储在一个变量中,以便在程序的其他地方使用,而不是记录这些值。

于 2013-10-29T04:12:31.630 回答