2017-01-24 7 views
3

Я пытаюсь сгладить двумерный массив словарей с использованием KVC.Сгладить массив словарей с помощью KVC

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

Почему словари «преобразуются» в NSNull?

ответ

4

Это потому, что valueForKeyPath: также применимо к словарям. И как это работает? Он выглядит в каждом словаре, пытается использовать "self" в качестве ключа, не находит такого ключа и возвращает NSNull для представления отсутствующего значения.

Чтобы увидеть, что я имею в виду, рассмотрим этот вариант на вашем примере:

NSArray *toBeFlatten = @[@[@{@"self":@"hey"}],@[@{@"other":@"ho"}]]; 
NSArray *flat = [toBeFlatten valueForKeyPath:@"@unionOfArrays.self"]; 

Результат является @[@"hey", NSNull.null] - значение "hey" для сопоставления ключевых "self" в первом словаре, и нуль, потому что ни одна клавиша не соответствует в второй словарь.

То, что вы, вероятно, имел в виду сказать, valueForKeyPath:@"@[email protected]" (обратите внимание на-знак, что делает self оператора, а не ключ).

+0

В целом, однако, я бы счел это использование 'self' довольно страшным, так как это недокументированный AFAIK. – matt

+0

Не думал так далеко, но это имеет смысл. Таким образом, на самом деле есть некоторые неправильные ответы. Как этот: http://stackoverflow.com/a/17091443/270265 – melbic

+0

@melbic Я не думаю, что вы очень оценили, что говорит мой ответ. «Неверный ответ», на который вы указали, не является неправильным, потому что самые внутренние объекты не являются словарями_. KVC имеет разные правила для того, что ключевой путь означает, когда мы достигаем словаря, чем для того, что это означает, когда мы достигаем какого-либо другого типа объекта. Ваш исходный код работал бы, если бы это были массивы массивов NSNumbers, например. – matt