Objective c 使用KVC展平字典数组

Objective c 使用KVC展平字典数组,objective-c,kvc,Objective C,Kvc,我正在尝试使用KVC将二维字典数组展平 NSArray *toBeFlatten = @[@[@{@1:@1}],@[@{@2:@2}]]; NSArray *flat = [toBeFlatten valueForKeyPath:@"@unionOfArrays.self"]; // flat:@[NSNull.null, NSNull.null]; 为什么字典“转换”为NSNull?这是因为valueForKeyPath:也适用于字典。它是如何工作的?它在每个字典中查找,尝试使用“self

我正在尝试使用KVC将二维字典数组展平

NSArray *toBeFlatten = @[@[@{@1:@1}],@[@{@2:@2}]];
NSArray *flat = [toBeFlatten valueForKeyPath:@"@unionOfArrays.self"];
// flat:@[NSNull.null, NSNull.null];

为什么字典“转换”为NSNull?

这是因为
valueForKeyPath:
也适用于字典。它是如何工作的?它在每个字典中查找,尝试使用
“self”
作为键,没有找到这样的键,并返回NSNull以表示缺少的值

为了理解我的意思,在你的例子中考虑这个变化:

NSArray *toBeFlatten = @[@[@{@"self":@"hey"}],@[@{@"other":@"ho"}]];
NSArray *flat = [toBeFlatten valueForKeyPath:@"@unionOfArrays.self"];
结果是
@[@“hey”,NSNull.null]
-第一个字典中匹配的键
“self”
的值
“hey”
,第二个字典中没有匹配的键,因此为null


你可能想说的是
valueForKeyPath:@“@unionOfArrays@self”
(注意at标志,使
self
成为一个操作员,而不是一个键)。

但是,总的来说,我会发现
self
的这种用法相当可怕,因为它在AFAIK是没有记录的。没想到那么远,但这很有道理。所以实际上有一些错误的答案。就像这样:@melbic我想你还没有完全理解我的回答。您指出的“错误答案”没有错,因为最里面的对象不是字典。当我们到达字典时,KVC对键路径的含义有不同的规则,当我们到达其他类型的对象时,KVC对键路径的含义有不同的规则。例如,@matt
self
的哪个用法是未记录的?
-[NSDictionary valueForKey:
的文档说明“如果键不以“@”开头,则调用objectForKey:。如果键以“@”开头,则去掉“@”,并使用键的其余部分调用[super valueForKey:]。KVC将键
self
转换为方法
self
@Willeke Brilliant,谢谢!那么,我是否应该编辑我的答案,说
@self
self
方法(而不是说“operator”)?