2010-02-23 4 views
2

Je cherche à créer un NSDictionary "crash-proof" comme j'utilise un sérialiseur JSON qui convertit une réponse du serveur dans un NSDictionary. En conséquence, parfois la clé pour le dictionnaire n'est pas présente. Actuellement, cela provoquera le crash de l'application, mais je préférerais qu'un NSString vide soit retourné pour que je puisse l'afficher dans l'interface.Crash-preuve NSDictionary

Une solution pourrait être que je vérifie la clé chaque fois que j'accède au dictionnaire, par ex.

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

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

    // Display @""; 
} 

Cependant, cela entraîne rapidement un code gonflé, difficile à lire.

j'avais pensé à créer un objet sur mesure NSDictionary, quelque chose comme:

@interface NSSafeDictionary : NSDictionary ..... 

qui remplace objectForKey avec l'énoncé ci-dessus.

Est-ce une approche satisfaisante?

Merci

Répondre

8

Vous allez toujours vouloir obtenir des chaînes de votre dictionnaire ou d'autres objets y seront-ils également stockés? Si ce n'est que des chaînes, je pense que le plus simple est de construire un category sur 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

Merci l'homme .... Ça marche – jailani

0

Étant donné qu'il vient sur le réseau, je pense que vous voulez désinfectez les données plus que la vérification des valeurs vides mais sinon, vous ne avez pas vraiment besoin d'hériter de NSDictionary .

Une méthode d'utilitaire simple dans votre classe ferait l'affaire.

Ou vous pouvez créer une catégorie sur NSDictionary:

@interface NSDictionary (Safe) 

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

@end 

(je suis sûr que vous pouvez comprendre la mise en œuvre.)