2010-08-30 3 views
3

Je souhaite remplacer plusieurs éléments de ma chaîne dans Objective-C.Objective-C String-Replace

En PHP, vous pouvez le faire:

str_replace(array("itemtoreplace", "anotheritemtoreplace", "yetanotheritemtoreplace"), "replacedValue", $string); 

Cependant, dans l'objectif-c la seule méthode que je sais est NSString replaceOccurancesOfString. Existe-t-il un moyen efficace de remplacer plusieurs chaînes?

Ceci est ma solution actuelle (très inefficace et .. bien ... à long)

NSString *newTitle = [[[itemTitleField.text stringByReplacingOccurrencesOfString:@"'" withString:@""] stringByReplacingOccurrencesOfString:@" " withString:@"'"] stringByReplacingOccurrencesOfString:@"^" withString:@""]; 

Voyez ce que je veux dire?

Merci, Stewart Christian

+0

Il n'y a pas équivalent à cette méthode PHP en Obj-C. Essayez de casser votre méthode d'appel en trois lignes afin que nous puissions voir exactement où l'accident se produit. – kubi

+0

Kubi, merci pour la réponse. Ce n'est pas vraiment l'accident qui me dérange. C'est l'inefficacité (si c'est un mot) de l'ensemble de l'affaire. Merci! Christian –

Répondre

12

Si c'est quelque chose que vous allez faire régulièrement dans ce programme ou un autre programme, faites peut-être une méthode ou une boucle conditionnelle pour passer la chaîne originale, et un tableau multidimensionnel pour maintenir les chaînes pour trouver/remplacer . Probablement pas le plus efficace, mais quelque chose comme ceci:

// Original String 
NSString *originalString = @"My^ mother^ told me not to go' outside' to' play today. Why did I not listen to her?"; 

// Method Start 
// MutableArray of String-pairs Arrays 
NSMutableArray *arrayOfStringsToReplace = [NSMutableArray arrayWithObjects: 
              [NSArray arrayWithObjects:@"'",@"",nil], 
              [NSArray arrayWithObjects:@" ",@"'",nil], 
              [NSArray arrayWithObjects:@"^",@"",nil], 
              nil]; 

// For or while loop to Find and Replace strings 
while ([arrayOfStringsToReplace count] >= 1) { 
    originalString = [originalString stringByReplacingOccurrencesOfString:[[arrayOfStringsToReplace objectAtIndex:0] objectAtIndex:0] 
               withString:[[arrayOfStringsToReplace objectAtIndex:0] objectAtIndex:1]]; 
    [arrayOfStringsToReplace removeObjectAtIndex:0]; 
} 

// Method End 

Sortie:

2010-08-29 19:03:15.127 StackOverflow[1214:a0f] My'mother'told'me'not'to'go'outside'to'play'today.'Why'did'I'not'listen'to'her? 
+0

Salut richard! INCROYABLE! Le message le plus détaillé que j'ai jamais vu. Juste demander - quelle est la sortie? Comment as-tu eu ça? Ressemble totalement à une sortie légitime dans la console - je veux dire - a0f ?? Avez-vous testé cela? Merci beaucoup! –

+0

La sortie était après que la "méthode" ait été appelée, NSLog (@ "% @", originalString); – Richard

+0

Devons-nous libérer les chaînes provisoires créées? – gav

-2

Ajouter le @ au début des toutes les chaînes, comme dans

withString:@"" 

Il manque pour quelques-uns.

+0

C'était juste mon problème pour taper ici. Je l'ai corrigé. Connaissez-vous un moyen efficace de le faire ??? Merci beaucoup. –

0

Vous envisagez d'écrire votre propre méthode? Tokenize la chaîne et itérer à travers chacun d'eux en remplaçant un par un, il n'y a vraiment pas de manière plus rapide que O (n) pour remplacer les mots dans une chaîne.

Serait une seule boucle au maximum.

+0

Aussi une bonne réponse. Merci beaucoup: D –

2

Il n'y a pas de façon plus compacte d'écrire ceci avec les frameworks Cocoa. Cela peut sembler inefficace du point de vue du code, mais dans la pratique ce genre de chose ne va probablement pas arriver aussi souvent, et à moins que votre contribution soit extrêmement importante et que vous le fassiez incroyablement fréquemment, vous n'en souffrirez pas. Pensez à les écrire sur trois lignes distinctes pour plus de lisibilité plutôt que de les enchaîner comme ça.

Vous pouvez toujours écrire votre propre fonction si vous faites quelque chose de critique pour la performance qui nécessite un remplacement par lots comme celui-ci. Ce serait même une question d'entrevue amusante. :)

+0

Grande réponse complète. Je pense que je vais aller avec cela pour le moment - je pourrais revenir à vous sur la fonction personnalisée: D. –

Questions connexes