2010-12-03 4 views
1

J'essaye de créer un NSDictionary avec la méthode dictionaryWithDictionary. Cependant, mon premier NSDictionary A peut avoir des clés avec des valeurs vides. Comment puis-je créer B qui n'a pas de clés avec des valeurs vides? Je fais tout cela dans le but de remplir un UITableView avec des lignes qui correspondent à chaque clé non-vide dans le NSDictionary.Copier un NSDictionary sans valeurs vides?

+2

Qu'est-ce qu'une "valeur vide" dans ce cas? NSDictionary n'autorise pas les valeurs 'nil'. –

+0

Une clé avec une variable vide. –

+1

Cela n'aide toujours pas, les valeurs d'un dictionnaire peuvent être n'importe quoi, NSString, NSNumber, même vos propres classes personnalisées. Si un dictionnaire ne contient pas de valeur pour une clé particulière, alors 'objectForKey:' renvoie 'nil'. Si vos valeurs sont des chaînes de longueur nulle ou des valeurs '[NSNull null]', alors faites le nous savoir. Il n'y a pas vraiment de "variable vide" dans Cocoa. – dreamlax

Répondre

1

Que diriez-vous quelque chose comme ceci:

NSMutableDictionary *destDictionary = [NSMutableDictionary dictionaryWithCapacity:[sourceDictionary count]]; 
NSEnumerator *keyEnumerator = [[sourceDictionary allKeys] objectEnumerator]; 
id key; 
while (key = [keyEnumerator nextObject]) 
    { 
    NSString *object = [sourceDictionary objectForKey:key]; 
    if ([object length] == 0) 
     continue; 
    [destDictionary setObject:object forKey:key]; 
    } 
+0

Qu'est-ce qui entrerait dans! Value? –

+0

Oups. 'object' a commencé comme 'value' dans mon exemple de code - et j'ai négligé de changer tout 'value' en 'object'. Échantillon maintenant fixé. Vous pourriez dire (object == nil) au lieu de (! Object), si vous préférez. – westsider

+0

Excellent exemple! Malheureusement, ça ne marche pas vraiment. Je suppose que l'objet existe tant que la clé existe, même si les valeurs sont toutes envoyées à vide (""). Je ne suis pas sûr de savoir comment contourner cela. –

0

Vous pouvez également utiliser un test de bloc, de filtrer les clés dont les valeurs ont une longueur et créer votre nouveau dictionnaire de cela.

NSSet *keySet = [dictionary keysOfEntriesPassingTest: 
       ^(id key, id obj, BOOL *stop) { 
        return (BOOL)[obj length]; 
       }]; 

NSArray *keys = [keySet allObjects]; 
NSArray *nonEmptyObjects = [dictionary objectsForKeys:keys notFoundMarker:@""]; 
NSDictionary *newDict = [NSDictionary dictionaryWithObjects:nonEmptyObjects 
                forKeys:keys]; 
Questions connexes