2013-08-09 2 views
6

중첩 된 NSDictionary에 대한 새 키를 만드는 데 문제가 있습니다.중첩 된 NSDictionary에 키 추가

, 이제 다른 루트 키와 내가 이런 짓을 중첩 된 키를 추가 할 수

Node1 =  { 
    SubNode11 = 40; 
    SubNode12 = 30; 
}; 

: 여기에 내가 같은 NSLogs

NSMutableDictionary *Ga=[NSMutableDictionary dictionaryWithDictionary:@{@"Node1" :@{@"SubNode11" :@40,@"SubNode12":@30}}]; 

NSMutableDictionary

의 종류가

을했을거야
[Ga setObject:@{@"SubNode21" : @555} forKey:@"Node2"]; 

이제 NSLog 출력 :

Node1 =  { 
    SubNode11 = 40; 
    SubNode12 = 30; 
}; 
Node2 =  { 
    SubNode21 = 555; 
}; 
} 

기존 노드에 다른 키를 추가해야합니다 (예 : SubNode22 = 345). '- [__ NSDictionaryI의 setObject : forKey :] : 별도의 코드 라인 노드 2에 대해, 그래서 나는이

[[Ga objectForKey:@"Node2"] setObject:@5555 forKey:@"SubNode22"]; 

작동하지만 응용 프로그램을 종료이 쇼 오류 "때문에 캐치되지 않는 예외'NSInvalidArgumentException ', 이유에 줄 알았는데 인식 선택기가 인스턴스로 전송 됨 "

나는 문제가 무엇인지 모르겠다.이 방법은 나에게 똑바로 보인다. 모든 해결책을 제공해주세요.

+0

같은 것을 수행해야'- [__NSDictionaryI setObject : forKey :] : 인식 할 수없는 셀렉터가 인스턴스에 전송되었습니다. '- 그게 무슨 뜻입니까? NSDictionary의 스펙을 찾아보고 setObject가 지원하는 메소드인지 확인하십시오. –

답변

8

여기의 문제는 중첩과는 아무런 관련이 없습니다. 그것은 변할 수있는 구절과 관련이 있습니다. 사전이 변경 가능하지 않으면 추가 할 수 없습니다.

NSDictionary의 메서드는 이므로 setObject:ForKey:이라는 메서드가 없다는 오류 메시지가 표시됩니다. 사과 사용 새로운 문자 사전 @{ key: object}은 불변 사전 만 생성합니다.

그래서 당신이 실제로 필요한 당신도 그래서 여기 [NSMutableDictionary dictionaryWithObjectsAndKeys:]; 또는 [@{ Key: Object } mutableCopy]

이 코드가

NSMutableDictionary *subNode = [NSMutableDictionary dictionaryWithObjectsAndKeys:@40, @"SubNode11", @30, @"SubNode12", nil]; 
NSMutableDictionary *Ga = [NSMutableDictionary dictionaryWithObjectsAndKeys:subNode, @"Node 1", nil]; 
[Ga setObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:@555, @"SubNode21", nil] forKey:@"Node2"]; 
[[Ga objectForKey:@"Node2"] setObject:@5555 forKey:@"SubNode22"]; 

당신은 여전히 ​​새로운 첨자의 일부를 사용할 수 있습니다 변경 사용 NSMutableDictionary의를 생성하고 있는지 확인하는 것입니다 기능은 비록. 이 같은 일을 더 읽기 이잖아처럼 예를 들어 당신이 뭔가에 코드를 변경할 수 있습니다

NSMutableDictionary *Ga = [NSMutableDictionary dictionary]; 

// Create SubNodes 
NSMutableDictionary *subNode1 = [NSMutableDictionary dictionary]; 
subNode1[@"SubNode11"] = @40; 
subNode1[@"SubNode12"] = @30; 

NSMutableDictionary *subNode2 = [NSMutableDictionary dictionary]; 
subNode2[@"SubNode21"] = @555; 

// Set SubNodes to Main Node Container 
Ga[@"Node1"] = subNode1; 
Ga[@"Node2"] = subNode2; 

// Set a nested subnode's value. 
Ga[@"Node2"][@"SubNode22"] = @5555; 
+0

솔루션을 주셔서 감사합니다, 정말 didnot 통지 모든 문제를 일으킨 중첩 된 사전을 정의하는 dictionarywithDictionary 않았다. 내가 문제를 해결하기 위해 한 것은 객체와 중첩 사전의 값을 따로 따로 추가 한 MutableDictionary를 만들었고 최종적으로이 사전 객체를 원문 사전에 추가 한 것입니다. 솔루션에서 작업 할 때 문제를 인식하지 못했습니다. –

+0

문제 없음, 해피 코딩 :) –

2

문제는 외부 사전이 NSMutableDictionary이지만, 내면의 사람이 (사람이 바로 @{} 구문을 사용하여 만든 것입니다)는 불변 NS 사전입니다. 명시 적으로 모두 변경 가능하게 만들 필요가 있습니다.

0

리터럴 사전 구문 (@{...} 구문)은 NSDictionary을 생성합니다. 실제 필요한 것은 NSMutableDictionary입니다. 합니다 (NSDictionary 클래스는 불변이며, setObject:forKey: 방법은 NSMutableDictionary 서브 클래스에만 존재하는, 당신은 예외를 얻고있는 이유입니다.)이 문제를 해결하려면, 당신은

[Ga setObject:[NSMutableDictionary dictionaryWithDictionary:@{@"SubNode21" : @555}] 
     forKey:@"Node2"];