【问题标题】:Flatten an array of dictionaries with KVC使用 KVC 展平一系列字典
【发布时间】:2017-06-09 10:49:14
【问题描述】:

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

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

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

【问题讨论】:

    标签: objective-c kvc


    【解决方案1】:

    这是因为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。
    • 没想到那么远,但这完全有道理。所以实际上存在一些错误的答案。喜欢这个:stackoverflow.com/a/17091443/270265
    • @melbic 我认为您不太欣赏我的回答。您指出的“错误答案”没有错,因为最里面的对象不是字典。 KVC 对当我们到达字典时键路径的含义与当我们到达某种其他类型的对象时的含义有不同的规则。例如,如果这些是 NSNumber 数组的数组,您的原始代码将可以工作。
    • @matt self 的哪项使用未被记录? -[NSDictionary valueForKey:] 的文档说“如果键不以“@”开头,则调用 objectForKey:。如果键确实以“@”开头,则剥离“@”并使用其余键调用 [super valueForKey:]。 ”。 KVC 将密钥 self 转换为方法 self
    • @Willeke Brilliant,谢谢!所以我应该编辑我的答案,说@selfself 方法(而不是说“操作员”)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2021-06-02
    • 1970-01-01
    • 2018-07-19
    • 2019-09-30
    • 2019-11-04
    • 2021-01-05
    相关资源
    最近更新 更多