用KVC拼合字典的数组

mel*_*bic 3 objective-c kvc

我正在尝试使用KVC使二维字典数组扁平化。

NSArray *toBeFlatten = @[@[@{@1:@1}],@[@{@2:@2}]];
NSArray *flat = [toBeFlatten valueForKeyPath:@"@unionOfArrays.self"];
// flat:@[NSNull.null, NSNull.null];
Run Code Online (Sandbox Code Playgroud)

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

mat*_*att 5

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

要了解我的意思,请考虑您的示例中的这种变化:

NSArray *toBeFlatten = @[@[@{@"self":@"hey"}],@[@{@"other":@"ho"}]];
NSArray *flat = [toBeFlatten valueForKeyPath:@"@unionOfArrays.self"];
Run Code Online (Sandbox Code Playgroud)

结果为@[@"hey", NSNull.null]— 第一个字典中"hey"匹配的键的值"self",而为null,因为第二个字典中没有匹配的键。

你大概的意思说的是valueForKeyPath:@"@unionOfArrays.@self"(通知at符号,使self运营商,而不是一个键)。

  • @matt哪种对self的用法没有记载?-[NSDictionary valueForKey:]`的文档说:“如果密钥不是以“ @”开头,则调用objectForKey:。如果密钥确实以“ @”开头,则剥离“ @”,然后使用以下命令调用[super valueForKey:]。其余的关键。”。KVC将密钥“ self”转换为方法“ self”。 (2认同)