2012-06-07 3 views
0

Я пытаюсь сделать жизнь немного легче для меня. Я получаю много значений из NSDictionary, как это:Напишите простую функцию C++ в объекте c

//First, make sure the object exist 
if ([myDict objectForKey: @"value"]) 
{ 
    NSString *string = [myDict objectForKey: @"value"]; 
    //Maybe do other things with the string here... 
} 

У меня есть файл (Variables.h), где я хранить много вещей, чтобы управлять приложением. Если было бы неплохо добавить несколько вспомогательных методов. Таким образом, вместо того, чтобы делать код выше, я хотел бы иметь Си ++ в Variables.h, так что я могу просто сделать это:

NSString *string = GetDictValue(myDictionary, @"value"); 

Как вы пишете, что с методом ++?

Заранее спасибо

+4

GetDictValue (MyDictionary, @ "значение"); [myDictionaryobjectForKey: @ "value"]; У них одинаковое количество символов ... Почему вы думаете, что первая строка более полезна, чем вторая? –

+0

Я полагаю, мне нужно было проверить, существует ли предмет в словаре? Значение иногда пусто – BlackMouse

+0

@ user1251004 Что бы ваша функция C++ вернулась в этом случае? – Stefan

ответ

2

Я полагаю, что это технически функция переменного тока, с ++ строгое требование

static NSString* GetDictValue(NSDictionary* dict, NSString* key) 
{ 
    if ([dict objectForKey:key]) 
    { 
     NSString *string = [dict objectForKey:key]; 
     return string; 
    } 
    else 
    { 
     return nil; 
    } 
} 

Рассмотрите возможность использования id и литья, где необходимо:

static id GetDictValue(NSDictionary* dict, NSString* key) 
{ 
    if ([dict objectForKey:key]) 
    { 
     id value = [dict objectForKey:key]; 
     return value; 
    } 
    else 
    { 
     return nil; 
    } 
} 
+0

Awesome. Только то, что мне было нужно. Спасибо – BlackMouse

+0

Но если [dict objectForKey: key] ничего не возвращает, что возвращает функция? –

+0

@MarcoPace: на ARM возвращаемое значение находится в r0, поэтому в этом случае 'dict' будет возвращен, что неверно. Эта функция также должна обрабатывать случай 'else'. – kfb

1

Лично я бы перепишите свой тест следующим образом, чтобы избавиться от поиска:

NSString *string = [myDict objectForKey: @"value"]; 
if (string) 
{ 
    // Do stuff. 
} 

Но если вы хотите иметь значение по умолчанию для отсутствующих ключей, а не имеют, чтобы быть функцией C++, я считаю, что более идиоматическим решением будет использование категории для расширения NSDictionary.

Тщательно непроверенный и неоткомпилированный код:

@interface NSDictionary (MyNSDictionaryExtensions) 
- (NSString*) objectForKey: (NSString*) key withDefaultValue: (NSString*) theDefault; 
- (NSString*) safeObjectForKey: (NSString*) key; 
@end 

@implementation NSDictionary (MyNSDictionaryExtensions) 
- (NSString*) objectForKey: (NSString*) key withDefaultValue: (NSString*) theDefault 
{ 
    NSString* value = (NSString*) [self objectForKey: key]; 
    return value ? value : theDefault; 
} 
- (NSString*) safeObjectForKey: (NSString*) key 
{ 
    return [self objectForKey: key withDefaultValue: @"Nope, not here"]; 
} 
@end 
Смежные вопросы