2017-01-24 4 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을 반환하여 누락 된 값을 나타냅니다.

은 무슨 뜻인지 볼 수 귀하의 예제에서이 변화를 고려하려면

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

결과는 @[@"hey", NSNull.null]입니다 - 첫번째로 사전에 일치하는 키 "self"의 값 "hey"하고는 null 키에 일치하지 않기 때문에 두 번째 사전. 당신은 아마 말을 의미가 무엇

은 (차리는 self 운영자가 아닌 키를 만들고, - 기호) valueForKeyPath:@"@[email protected]"이다.

+0

그러나 전체적으로 AFAIK라는 문서화되지 않은 'self'라는이 사용법을 발견하게 될 것입니다. – matt

+0

멀리까지 생각하지는 않았지만 그 말이 완벽합니다. 실제로 잘못된 답변이 주위에 떠 다니고 있습니다. 이 답변처럼 : http://stackoverflow.com/a/17091443/270265 – melbic

+0

@melbic 나는 내 대답에 대해 당신이 매우 감사한다고 생각하지 않는다. 안쪽 대상이 _ 사전이 아니기 때문에 당신이 지적한 "잘못된 대답"은 잘못이 아닙니다. KVC는 다른 유형의 객체에 도달 할 때 의미하는 것보다 사전에 도달 할 때 키 경로가 의미하는 것에 대한 다른 규칙을 가지고 있습니다. 예를 들어 NSNumbers 배열의 배열 일 경우 원래 코드가 작동했을 것입니다. – matt