NSDictionary에 추가하는 방법


93

나는 a를 사용하고 NSMutableArray있었고 사전을 사용하는 것이 내가 달성하려는 것에 대해 훨씬 더 간단하다는 것을 깨달았습니다.

키를 a로 저장하고 NSString값을으로 int사전 에 저장하고 싶습니다 . 어떻게하나요? 둘째, 가변 사전과 일반 사전의 차이점은 무엇입니까?

답변:


199

변경 가능한 사전은 변경 추가 및 제거 개체 수, 즉 수 있습니다. 불변는 이 생성되면 고정된다.

생성 및 추가 :

NSMutableDictionary *dict = [[NSMutableDictionary alloc]initWithCapacity:10];
[dict setObject:[NSNumber numberWithInt:42] forKey:@"A cool number"];

검색 :

int myNumber = [[dict objectForKey:@"A cool number"] intValue];

용량으로 초기화해야합니까, 아니면 동적 일 수 있습니까?
muttley91 2013-08-03

2
초기 용량을 지정할 필요는 없지만 그렇게하면 성능이 향상 될 수 있습니다. 포함 할 항목 수를 미리 알고있는 경우이 숫자 또는 약간 더 큰 값을 제공하십시오.
Eiko

NSMutableDictionary가 아닌 NSDictionary를 요구합니까?
Ananta Prasad

35

설정하면 개체의 setValue:(id)value forKey:(id)key방법을 사용 NSMutableDictionary합니다.

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setValue:[NSNumber numberWithInt:5] forKey:@"age"];

또는 최신 Objective-C에서 :

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
dict[@"age"] = @5;

mutable과 "normal"의 차이점은 가변성입니다. 즉 , "normal" 과 함께 할 수없는 동안 NSMutableDictionary(및 NSMutableArray) 의 내용을 변경할 수 있습니다.NSDictionaryNSArray


2
그 정수를 NSNumber로 감싸 야하지 않습니까?
Johan Kool

이 문제가 하나 더 있습니다. 사용자가 입력 한 텍스트를 문자열로 저장하고 사용자가 텍스트를 저장할 이미지 참조 (이미지 배열의 인덱스)를 저장해야합니다. 방금 언급 한 각각에 대해 하나씩 2 개의 변수가있는 객체의 mutableArray를 시도했습니다. tableView를 배열 개체 텍스트 값으로 채우려 고 할 때 제대로 작동하지 않았습니다. 그래서 저는 사전을 생각했습니다. 유일한 문제는 인덱스로 데이터를 검색 할 수있는 것처럼 보이지 않는다는 것입니다. 해시 맵과 같은 키 또는 값이어야합니다.
시스템

@Johan-정확하고 업데이트되었습니다! @alJaree-예, 사전은 일종의 키-값 저장소입니다. 나는 당신의 입장에서 사전의 배열이 더 나을 것이라고 생각합니다. 같은 것[{image: "/path/to/img/1.jpg", data: "foo bar 1"}, {image: "/path/to/img/2.jpg", data: "foo bar 2"}, ..., {image: "/path/to/img/N.jpg", data: "foo bar N"}]
Eimantas 2010-07-01

각 개체에서 텍스트를 검색하고이를 사용하여 즐겨 찾기 UITableView를 채워야 할뿐만 아니라 선택한 즐겨 찾기 이미지를 검색하고 표시 할 수 있도록 이미지 배열에 대한 인덱스 참조가 필요하기 때문에 여전히 작동하지 않습니다. 위에서 설명한 객체를 시도했지만 저장된 특정 객체가 아닌 어떤 이유로 NSStrings 배열에서 읽을 때 반환 된 객체입니다. 여기서 무엇을해야할지 모르겠습니다.
시스템

@ "% d _ % @, index, savedTitle과 같은 NSStrings를 저장 한 다음 NSString을 분할하고 필요한 것을 가져 와서 지불해야 할 수도 있다고 생각합니다. Java 용어로 생각하고 있습니다. obj c의 분할 함수. :)
시스템

16

배열이 선언 될 때마다 다음과 같이 NSDictionary에 키-값을 추가해야합니다.

NSDictionary *normalDict = [[NSDictionary alloc]initWithObjectsAndKeys:@"Value1",@"Key1",@"Value2",@"Key2",@"Value3",@"Key3",nil];

이 NSDictionary에서 키 값을 추가하거나 제거 할 수 없습니다.

NSMutableDictionary에서와 마찬가지로이 방법을 사용하여 배열을 초기화 한 후 객체를 추가 할 수 있습니다.

NSMutableDictionary *mutableDict = [[NSMutableDictionary alloc]init];'
[mutableDict setObject:@"Value1" forKey:@"Key1"];
[mutableDict setObject:@"Value2" forKey:@"Key2"];
[mutableDict setObject:@"Value3" forKey:@"Key3"];

키 값을 제거하려면 다음 코드를 사용해야합니다.

[mutableDict removeObject:@"Value1" forKey:@"Key1"];

12

버전 업데이트

목표 -C

창조하다:

NSDictionary *dictionary = @{@"myKey1": @7, @"myKey2": @5}; 

변화:

NSMutableDictionary *mutableDictionary = [dictionary mutableCopy];     //Make the dictionary mutable to change/add
mutableDictionary[@"myKey3"] = @3;

약식 구문은 Objective-C Literals.

빠른

창조하다:

var dictionary = ["myKey1": 7, "myKey2": 5]

변화:

dictionary["myKey3"] = 3

1

당신이 물어보고 싶은 것은 "변형 가능한 배열과 비 변형 가능한 배열 또는 사전의 차이점은 무엇입니까?"입니다. 이미 알고있는 것을 설명하기 위해 여러 용어가 사용됩니다. 이 경우 "mutable"이라는 용어를 "dynamic"으로 바꿀 수 있습니다. 따라서 변경 가능한 사전 또는 배열은 "동적"이며 런타임에 변경 될 수있는 반면, 변경 불가능한 사전 또는 배열은 "정적"이고 코드에서 정의되고 런타임에 변경되지 않는 사전 또는 배열입니다. , 요소를 추가, 삭제 또는 정렬하지 않습니다.)

수행 방법에 관해서는 여기에서 문서를 반복하도록 요청하고 있습니다. 여러분이해야 할 일은 샘플 코드와 Xcode 문서를 검색하여 정확히 어떻게 수행되는지 확인하는 것입니다. 하지만 제가 처음 배웠을 때 변덕스러운 일도 저를 던졌습니다. 그래서 그것을 줄 것입니다!


때때로 Xcode 문서에 대한 충분한 설명이 없을 때도 있고, 항상은 아니지만 때로는 명확한 예제없이 심층 이론에 들어갑니다. : P 예, 변경 가능 (변이 가능) 부분을 이해합니다. 감사합니다. :)
시스템

0

참고 로 리터럴 initWithDictionary로 초기화 하는 데 사용할 수도 있습니다 NSMutableDictionary.

NSMutableDictionary buttons = [[NSMutableDictionary alloc] initWithDictionary: @{
    @"touch": @0,
    @"app": @0,
    @"back": @0,
    @"volup": @0,
    @"voldown": @0
}];
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.