При возврате NSDictionary
(см. @ решение Yihui Yang ) или пользовательского класса (см. @ решение Sulthan ) для него являются действительными решениями, возможно, это будет слишком много .
Вам нужно запомнить ключи возвращаемого словаря или, может быть, создать собственный класс только для этого.
Вот еще две возможности:
У меня будет образец dict для проверки:
NSDictionary *dictToTest1 = @{@"id": @"idString",
@"noiseKey": @"noiseValue"
};
NSDictionary *dictToTest2 = @{@"messages": @"messagesString",
@"noiseKey": @"noiseValue"
};
Я упросту ваш тест, чтобы проверять только наличие ключа / значения для ключа id
или для messages
.
Использование двойных указателей:
-(void)loadDict:(NSDictionary *)dict withRetKey:(NSString **)key andRetValue:(NSString **)value
{
NSString *retKey = nil;
NSString *retValue = nil;
if (dict[@"id"])
{
retKey = @"id";
retValue = dict[@"id"];
}
else if (dict[@"messages"])
{
retKey = @"messages";
retValue = dict[@"messages"];
}
if (key)
{
*key = retKey;
}
if (value)
{
*value = retValue;
}
}
Образец теста:
NSString *key1 = nil;
NSString *value1 = nil;
[self loadDict:dictToTest1 withRetKey:&key1 andRetValue:&value1];
NSLog(@"Key1: %@\t value1: %@", key1, value1);
NSString *key2 = nil;
NSString *value2 = nil;
[self loadDict:dictToTest2 withRetKey:&key2 andRetValue:&value2];
NSLog(@"Key2: %@\t value2: %@", key2, value2);
Выход:
$> Key1: id value1: idString
$> Key2: messages value2: messagesString
Где вы видели &
для объектов?
Почти все время в управлении NSError
. ( связанный вопрос )
Для примитива? Например, если вы хотите получить красный / синий / зеленый / альфа из UIColor
( связанный вопрос )
С блоками:
-(void)blockLoadDict:(NSDictionary *)dict withBlock:(void(^) (NSString *key, NSString *value))block
{
NSString *retKey = @"";
NSString *retValue = @"";
if (dict[@"id"])
{
retKey = @"id";
retValue = dict[@"id"];
}
else if (dict[@"messages"])
{
retKey = @"messages";
retValue = dict[@"messages"];
}
if (block)
{
block(retKey, retValue);
}
}
Пример:
__block NSString *key3 = nil;
__block NSString *value3 = nil;
[self blockLoadDict:dictToTest1 withBlock:^(NSString *key, NSString *value) {
key3 = key;
value3 = value;
}];
NSLog(@"Block Key3: %@\t value3: %@", key3, value3);
__block NSString *key4 = nil;
__block NSString *value4 = nil;
[self blockLoadDict:dictToTest2 withBlock:^(NSString *key, NSString *value) {
key4 = key;
value4 = value;
}];
NSLog(@"Block Key4: %@\t value4: %@", key4, value4);
Выход:
$> Block Key3: id value3: idString
$> Block Key4: messages value4: messagesString