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
Swift를 사용하면 다음과 같습니다.
if myDic[KEY] != nil {
// key exists
}
예. 이러한 종류의 오류는 매우 일반적이며 앱 충돌로 이어집니다. 따라서 다음과 같이 각 프로젝트에 NSDictionary를 추가하는 데 사용합니다.
//.h 파일 코드 :
@interface NSDictionary (AppDictionary)
- (id)objectForKeyNotNull : (id)key;
@end
//.m 파일 코드는 다음과 같습니다
#import "NSDictionary+WKDictionary.h"
@implementation NSDictionary (WKDictionary)
- (id)objectForKeyNotNull:(id)key {
id object = [self objectForKey:key];
if (object == [NSNull null])
return nil;
return object;
}
@end
코드에서는 다음과 같이 사용할 수 있습니다.
NSStrting *testString = [dict objectForKeyNotNull:@"blah"];
NSDictionary에서 키의 존재를 확인하려면 :
if([dictionary objectForKey:@"Replace your key here"] != nil)
NSLog(@"Key Exists");
else
NSLog(@"Key not Exists");
nil은 Foundation 데이터 구조에 저장 될 수 없기 때문에 NSNull
때때로를 나타냅니다 nil
. NSNull
단일 객체 이므로 NSNull
직접 포인터 비교를 사용하여 값이 사전에 저장되어 있는지 확인할 수 있습니다 .
if ((NSNull *)[user objectForKey:@"myKey"] == [NSNull null]) { }
신속한 4.2 솔루션
따라서 사전에 키가 있는지 여부에 대한 질문에 대답하려면 다음을 요청하십시오.
let keyExists = dict[key] != nil
값을 원하고 사전에 키가 포함되어 있다는 것을 알고 있다면 다음과 같이 말합니다.
let val = dict[key]!
그러나 일반적으로 발생하는 것처럼 키에 키가 있는지 알지 못하는 경우 키를 가져 와서 사용하고 싶지만 존재하는 경우에만 다음과 같이 사용하십시오 if let
.
if let val = dict[key] {
// now val is not nil and the Optional has been unwrapped, so use it
}
조회 결과를 임시 변수에 저장하고 임시 변수가 nil인지 테스트 한 다음 사용하는 것이 좋습니다. 그렇게하면 같은 객체를 두 번 보지 않습니다.
id obj = [dict objectForKey:@"blah"];
if (obj) {
// use obj
} else {
// Do something else
}
Adirael이 objectForKey
키 존재 여부를 확인 하도록 제안 했지만 objectForKey
nullable 사전 을 호출하면 앱이 다운되어 다음과 같은 방식으로 수정했습니다.
- (instancetype)initWithDictionary:(NSDictionary*)dictionary {
id object = dictionary;
if (dictionary && (object != [NSNull null])) {
self.name = [dictionary objectForKey:@"name"];
self.age = [dictionary objectForKey:@"age"];
}
return self;
}
if ([MyDictionary objectForKey:MyKey]) {
// "Key Exist"
}
'development' 카테고리의 다른 글
NSOperation 및 그랜드 센트럴 디스패치 (0) | 2020.02.16 |
---|---|
SQL Server에 .NET의 Math.Max와 같은 두 가지 값을 취하는 Max 함수가 있습니까? (0) | 2020.02.16 |
둥근 모서리로 레이아웃을 만드는 방법 ..? (0) | 2020.02.16 |
MySQL-SELECT 쿼리 기반 업데이트 쿼리 (0) | 2020.02.16 |
공유 환경 설정 삭제 (0) | 2020.02.16 |