[objective-c] NSDictionary 또는 NSMutableDictionary에 키가 있는지 확인하는 방법?

dict에 키가 있는지 확인해야합니다. 어떻게?



답변

objectForKey 키가 없으면 nil을 반환합니다.


답변

if ([[dictionary allKeys] containsObject:key]) {
    // contains key
}

또는

if ([dictionary objectForKey:key]) {
    // contains object
}


답변

Objective-C 및 Clang의 최신 버전에는 다음과 같은 최신 구문이 있습니다.

if (myDictionary[myKey]) {

}

nil이 아닌 Objective-C 오브젝트 만 사전 (또는 배열)에 저장할 수 있으므로 nil과 동일한 지 검사 할 필요가 없습니다. 그리고 모든 Objective-C 객체는 진실한 가치입니다. 심지어 @NO, @0그리고 [NSNull null]참으로 평가합니다.

편집 : 스위프트는 이제 일입니다.

Swift의 경우 다음과 같은 것을 시도해보십시오.

if let value = myDictionary[myKey] {

}

이 구문은 myKey가 dict에 있고 if이면 값을 value 변수에 저장하는 경우에만 if 블록을 실행합니다. 이것은 0과 같은 잘못된 값에도 적용됩니다.


답변

if ([mydict objectForKey:@"mykey"]) {
    // key exists.
}
else
{
    // ...
}


답변

JSON 사전을 사용하는 경우 :

#define isNull(value) value == nil || [value isKindOfClass:[NSNull class]]

if( isNull( dict[@"my_key"] ) )
{
    // do stuff
}


답변

나는 당신이 obj를 두 번 요구하더라도 Fernandes의 대답을 좋아합니다.

이것은 또한해야합니다 (마틴의 A와 다소 같음).

id obj;

if ((obj=[dict objectForKey:@"blah"])) {
   // use obj
} else {
   // Do something else like creating the obj and add the kv pair to the dict
}

Martin 과이 답변은 모두 iPad2 iOS 5.0.1 9A405에서 작동합니다.


답변

방금 디버깅하는 데 약간의 시간을 낭비한 매우 불쾌한 한 가지-자동 완성 메시지를 사용 doesContain하여 작동하는 것처럼 보일 수 있습니다.

단, doesContain사용하는 해시 비교 대신 ID 비교를 사용 objectForKey하므로 문자열 키가있는 사전이 있으면 NO를 a에 반환합니다 doesContain.

NSMutableDictionary* keysByName = [[NSMutableDictionary alloc] init];
keysByName[@"fred"] = @1;
NSString* test = @"fred";

if ([keysByName objectForKey:test] != nil)
    NSLog(@"\nit works for key lookups");  // OK
else
    NSLog(@"\nsod it");

if (keysByName[test] != nil)
    NSLog(@"\nit works for key lookups using indexed syntax");  // OK
else
    NSLog(@"\nsod it");

if ([keysByName doesContain:@"fred"])
    NSLog(@"\n doesContain works literally");
else
    NSLog(@"\nsod it");  // this one fails because of id comparison used by doesContain