Это потому, что valueForKeyPath:
также применимо к словарям. И как это работает? Он выглядит в каждом словаре, пытается использовать "self"
в качестве ключа, не находит такого ключа и возвращает NSNull для представления отсутствующего значения.
Чтобы увидеть, что я имею в виду, рассмотрим этот вариант на вашем примере:
NSArray *toBeFlatten = @[@[@{@"self":@"hey"}],@[@{@"other":@"ho"}]];
NSArray *flat = [toBeFlatten valueForKeyPath:@"@unionOfArrays.self"];
Результат является @[@"hey", NSNull.null]
- значение "hey"
для сопоставления ключевых "self"
в первом словаре, и нуль, потому что ни одна клавиша не соответствует в второй словарь.
То, что вы, вероятно, имел в виду сказать, valueForKeyPath:@"@[email protected]"
(обратите внимание на-знак, что делает self
оператора, а не ключ).
В целом, однако, я бы счел это использование 'self' довольно страшным, так как это недокументированный AFAIK. – matt
Не думал так далеко, но это имеет смысл. Таким образом, на самом деле есть некоторые неправильные ответы. Как этот: http://stackoverflow.com/a/17091443/270265 – melbic
@melbic Я не думаю, что вы очень оценили, что говорит мой ответ. «Неверный ответ», на который вы указали, не является неправильным, потому что самые внутренние объекты не являются словарями_. KVC имеет разные правила для того, что ключевой путь означает, когда мы достигаем словаря, чем для того, что это означает, когда мы достигаем какого-либо другого типа объекта. Ваш исходный код работал бы, если бы это были массивы массивов NSNumbers, например. – matt