2017-01-24 7 views
3

私はKVCを使用して辞書の2次元配列を平坦化しようとしています。KVCで辞書の配列を平滑化

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

なぜ辞書が「NSNull」に変換されるのですか?

答えて

4

valueForKeyPath:は、も辞書に適用されるためです。そしてそれはどのように機能しますか?各辞書を調べるとはをキーとして使用しようとしますが、そのようなキーは見つからず、NSNullを返して欠損値を表します。 - 何のキーはにマッチしていないので、最初の辞書に一致するキー"self"の値"hey"、およびヌル

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

結果は@[@"hey", NSNull.null]次のとおりです、私が何を意味するか見るあなたの例で、この変動を考慮することが

2番目の辞書

おそらくvalueForKeyPath:@"@[email protected]"と表示されます(selfはキーではなく、アットマークに注意してください)。

+0

しかし、私はAFAIKとして文書化されていないので、全体的にはこの「自己」の使用はむしろ怖いでしょう。 – matt

+0

それは遠いとは思っていませんでしたが、それは完璧な意味があります。実際に間違った答えが浮かんでいます。このように:http://stackoverflow.com/a/17091443/270265 – melbic

+0

@melbic私はあなたが私の答えが言っていることを非常に感謝しているとは思わない。あなたが指し示す "間違った答え"は間違っていません。最も内側のオブジェクトは_dictionaries_ではないからです。 KVCは、他のタイプのオブジェクトに到達したときの意味よりも、キーパスが辞書に到達したときに意味するものとは異なるルールを持っています。これらがNSNumbersの配列の配列だった場合、元のコードが機能していました。 – matt

関連する問題