2011-06-02 3 views
3

J'ai un dictionnaire dont les clés sont NSStrings et dont les objets sont NSArray. Voici un exemple:Quelle est la meilleure façon de générer cette chaîne? (NSMutableString ...)

key (NSString) : GroupA 
value (NSArray): John 
       Alex 
       Joe 
       Bob 

Il y a beaucoup d'entrées comme ceci, ceci est juste un exemple. Ce que je dois faire est de générer une chaîne comme celui-ci (par exemple:

(GroupA contains[cd] ('John' OR 'Alex' OR 'Joe' OR 'Bob')) AND (GroupB contains[cd] ('Starcraft' OR 'WOW' OR 'Warcraft' OR 'Diablo')) AND ..... 

Je vais être alimenter cette chaîne à un NSPredicate Quelle est la meilleure façon de générer cette chaîne que je peux utiliser pour les boucles et si.? et tout ça, mais est-il un moyen? Merci.

Répondre

5

ce n'est pas une chaîne de format prédicat valide, même si vous finissez par le générer, vous ne serez pas en mesure de le convertir en NSPredicate

Voici ce que vous voulez à la place:

NSDictionary *groupValuePairs = ....; 

NSMutableArray *subpredicates = [NSMutableArray array]; 
for (NSString *group in groupValuePairs) { 
    NSArray *values = [groupValuePairs objectForKey:group]; 
    NSPredicate *p = [NSPredicate predicateWithFormat:@"%K IN %@", group, values]; 
    [subpredicates addObject:p]; 
} 

NSPredicate *final = [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates]; 

Cela n'a pas et diacritique-Case- que votre manque de sensibilité insinuait d'origine. Si vous en avez vraiment besoin, alors vous aurez besoin d'être un peu plus compliqué:

NSDictionary *groupValuePairs = ....; 

NSMutableArray *subpredicates = [NSMutableArray array]; 
for (NSString *group in groupValuePairs) { 
    NSArray *values = [groupValuePairs objectForKey:group]; 
    NSMutableArray *groupSubpredicates = [NSMutableArray array]; 
    for (NSString *value in values) { 
     NSPredicate *p = [NSPredicate predicateWithFormat:@"%K contains[cd] %@", group, value]; 
     [groupSubpredicates addObject:p]; 
    } 
    NSPredicate *p = [NSCompoundPredicate orPredicateWithSubpredicates:groupSubpredicates]; 
    [subpredicates addObject:p]; 
} 

NSPredicate *final = [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates]; 
+0

Wow .... dois en savoir plus sur NSPredicate ... merci pour cela! – user635064

1

beaucoup plus élégant, il devrait être quelque chose comme ça

NSDictionary *myDict = [NSDictionary dictionaryWithObject:[NSArray arrayWithObjects:@"John",@"Alex",@"Joe",@"Bob",nil] forKey:@"GroupA"]; 
NSString *myString = @"("; 

int j = 0; 
for(NSString *key in [myDict allKeys]) { 
    NSString *value = [myDict valueForKey:key]; 
    myString = [myString stringByAppendingFormat:@"%@ contains[cd] (", key]; 
    NSArray *myArray = (NSArray *)value; 

    int idx = 0; 
    for(NSString *name in myArray) { 
     myString = [myString stringByAppendingFormat:@"'%@'",name]; 
     if(idx < [myArray count] - 1) { 
      myString = [myString stringByAppendingFormat:@" OR "]; 
     } 
     idx++; 
    } 

    myString = [myString stringByAppendingString:@")"]; 

    if(j < [myDict count] -1) { 
     myString = [myString stringByAppendingString:@" AND "]; 
    } 

    j++; 

}; 

myString = [myString stringByAppendingString:@")"]; 

NSLog(@"mystring %@",myString); 
+2

Que se passe-t-il si 'name' contient une apostrophe, par ex. O'Hara? –

+0

C'est tellement "PHP way" ... –

+0

Vraiment? Alors, pourquoi juste baisser ma réponse sans fournir la vôtre? #trollin – brandontreb

Questions connexes