我在 NSArray 中有一个 NSArray ,所以:
@[
@[ @1, @2, @3 ],
@[ @7, @6 ]
]
如何使用该方法valueForKeyPath:
获取每个数组中的项目数,所以:
@[ @3, @2 ]
我已经尝试过,但这提供了与(so 2)[array valueForKeyPath:@"@count"]
相同的答案。[array count]
[array valueForKeyPath:@"count"]
我在 NSArray 中有一个 NSArray ,所以:
@[
@[ @1, @2, @3 ],
@[ @7, @6 ]
]
如何使用该方法valueForKeyPath:
获取每个数组中的项目数,所以:
@[ @3, @2 ]
我已经尝试过,但这提供了与(so 2)[array valueForKeyPath:@"@count"]
相同的答案。[array count]
[array valueForKeyPath:@"count"]
结合使用@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"
as key path 也不起作用,因为它在其左侧的 key 上操作,valueForKeyPath:
当没有指定其他 key path 时,暗示它是方法的接收者。
我们需要的是一种方法来指定@count
运算符不应该计算封闭数组而是计算其中的元素。在我们的关键路径中使用@unionOfObjects
集合操作符可以实现这一点。如果我们有一个关键路径,例如:
@unionOfObjects.$COLLECTION.$REST_OF_KEYPATH
然后返回的结果将是由作为参数发送消息的每个元素的结果形成$COLLECTION
的valueForKeyPath:
数组$REST_OF_KEYPATH
。最后一个事实 - 当valueForKeyPath:
消息的接收者本身是一个集合时,$COLLECTION
可以在 key path 中使用 string 指定self
。
因此,我们的关键路径应如下所示:
@"@unionOfObjects.self.@count"
这指定将返回一个数组,其中每个元素都是发送-valueForKeyPath:@"@count"
到接收器中每个元素的结果。最后,我不确定这样做是否可取,但似乎 self 可以完全从密钥路径中删除,只要@unionOfObjects
操作员不是密钥路径的唯一组成部分。在这种情况下,它替代@unionOfObjects.$COLLECTION
了密钥路径的组件。
我不确定你想如何“获取”每个数组中的项目数(即返回一个值,或者只是将它记录到控制台)。另外,如果您只想要每个子数组中的项目数,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]);
}
更进一步,您可以将它们存储在一个变量中,以便在程序的其他地方使用,而不是记录这些值。