[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