2013-06-15 2 views
2

У меня есть NSDictionary и что получить тип данных для значения с учетом ключаКак получить тип данных значения с ключом NSDictionary?

Возможно ли это?

+0

Имеет ли 'NSDictionary' * первый элемент *? Я не думаю, что перечисление имеет гарантированный порядок. –

+0

Словарь не имеет «первого элемента», как вы говорите. В массиве элементы упорядочиваются, но словарь имеет только пары ключей: значения, которые не гарантируются в любом порядке. Приведите пример того, как вы пытаетесь использовать это. –

+0

Я исправил quesiton, я имею в виду тип данных из значения, заданного ключом – RollRoll

ответ

3

Вы можете проверить варианты вы принимаете на

id objectValue = [dictionary valueForKey:@"SomeKey"]; 
if ([objectValue isKindOfClass:[NSString class]]) { 
    //Object is a NSString 
} else if ([objectValue isKindOfClass:[NSArray class]]) { 
    //Object is a NSArray 
} else if ([objectValue isKindOfClass:[NSDictionary class]]) { 
    //Object is a NSDictionary 
} else if ([objectValue isKindOfClass:[NSNumber class]]) { 
    //Object is a NSNumber 
} 

и так далее .. В этом шаблоне просто обрабатывать все типы приложение поддерживает. Игнорируйте значения, которые ваше приложение не поддерживает по этому шаблону, или просто отказываются изящно другим способом, если вы не поддерживаете тип данных значения

Чтобы просто выяснить, какой класс он (для отладки приложения, например), вы можно сделать:

NSString *className = NSStringFromClass([objectValue class]); 
0

вы могли бы использовать NSStringFromClass для получения типа, или если это невозможно, вы можете использовать isKindOfClass:

NSDictionary *dictionary = @{ 
          @"string": @"Something", 
          @"number": @(1), 
          @"null": [NSNull null], 
          @"custom": [[CustomType alloc] init] 
          }; 


[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { 
    NSLog(@"type = %@", NSStringFromClass([obj class])); 
}]; 

выход:

type = CustomType 
type = NSNull 
type = __NSCFNumber 
type = __NSCFConstantString 
+0

Всегда kindOfClass, потому что кластер классов скажет вам что-то, что вы, возможно, не сможете использовать. – uchuugaka

+0

Я пытался избежать множества утверждений if-else, но это зависит от его использования для вывода на нужное решение - что неясно в вопросе. –

Смежные вопросы