我在NSArray中有一个NSArray,所以:
@[
@[ @1, @2, @3 ],
@[ @7, @6 ]
]
如何使用方法valueForKeyPath:
获取每个数组中的项目数,所以:
@[ @3, @2 ]
我尝试了[array valueForKeyPath:@"@count"]
,但提供与[array count]
相同的答案(2)和[array valueForKeyPath:@"count"]
。
答案 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]);
}
更进一步,不是记录值,而是将它们存储在变量中,以便在程序的其他地方使用。