二维NSArray中的对象数

时间:2013-10-29 03:32:37

标签: ios objective-c arrays

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

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

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

@[ @3, @2 ]

我尝试了[array valueForKeyPath:@"@count"],但提供与[array count]相同的答案(2)和[array valueForKeyPath:@"count"]

2 个答案:

答案 0 :(得分:11)

结合使用@unionOfObjects@count KVC集合运算符:

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

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

counts = (
    3,
    2
)

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

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

@unionOfObjects.$COLLECTION.$REST_OF_KEYPATH

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

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

self

这指定将返回一个数组,其中每个元素都是向接收器中的每个元素发送@"@unionOfObjects.self.@count" 的结果。最后,我不确定这是否可取,但似乎只要-valueForKeyPath:@"@count"运算符不是键路径的唯一组件,self就可以完全从keypath中删除。在这种情况下,它会替换密钥路径的@unionOfObjects组件。

答案 1 :(得分:-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]);  
}

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