Ударопрочный NSDictionary - PullRequest
       16

Ударопрочный NSDictionary

2 голосов
/ 23 февраля 2010

Я пытаюсь создать «защищенный от сбоев» NSDictionary, поскольку я использую сериализатор JSON, который преобразует ответ сервера в NSDictionary. Как результат, иногда ключа для словаря нет. В настоящее время это приведет к сбою приложения, однако я бы предпочел вернуть пустую строку NSString, чтобы я мог отобразить это в интерфейсе.

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

if([returnedDictionary objectForKey:@"key"]){

   // Display [returnedDictionary objectForKey:@"key"];
}else{

   // Display @"";
}

Однако вскоре это приведет к раздутому, трудно читаемому коду.

Я думал о создании пользовательского объекта NSDictionary, что-то вроде:

@interface NSSafeDictionary : NSDictionary .....

, который переопределяет objectForKey приведенным выше оператором.

Это удовлетворительный подход?

Спасибо

Ответы [ 2 ]

8 голосов
/ 23 февраля 2010

Вы всегда хотите получать строки из своего словаря или в нем будут храниться и другие объекты? Если это только строки, я думаю, что самый простой способ обойти это - создать категорию на NSDictionary.

@interface NSDictionary ( EmptyStrings )
- (NSString *)stringForKey:(id)aKey;
@end

@implementation NSDictionary ( EmptyStrings )

- (NSString *)stringForKey:(id)aKey {
    id object = [self objectForKey:aKey];
    if (object == nil ) {
        return @"";
    }
    if ([object isKindOfClass:[NSString class]) {
        return object;
    } else {
        return nil;
    }
}

@end
0 голосов
/ 23 февраля 2010

Учитывая, что это происходит по сети, я думаю, что вы захотите очистить данные больше, чем просто проверять пустые значения, но если нет, вам не нужно наследовать от NSDictionary.

Простой вспомогательный метод в вашем классе поможет.

Или вы можете создать категорию на NSDictionary:

@interface NSDictionary (Safe)

-(NSString*)safeStringForKey:(NSString*)key;

@end

(я уверен, что вы можете выяснить реализацию.)

...