2012-06-23 11 views
5

Vorrei passare attraverso un NSString e chiamare una funzione personalizzata su ogni parola che ha determinati criteri (Ad esempio, "ha 2 'L's"). Mi stavo chiedendo quale fosse il modo migliore per avvicinarsi a quello. Dovrei usare i modelli Trova/Sostituisci? Blocchi?Chiamare un metodo su ogni parola in NSString

-(NSString *)convert:(NSString *)wordToConvert{ 
    /// This I have already written 
    Return finalWord; 
} 

-(NSString *) method:(NSString *) sentenceContainingWords{ 
    // match every word that meets the criteria (for example the 2Ls) and replace it with what convert: does. 
} 

risposta

2

I due modi che conosco di looping una matrice che lavorerà per voi sono i seguenti:

NSArray *words = [sentence componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

for (NSString *word in words) 
{ 
    NSString *transformedWord = [obj method:word]; 
} 

e

NSArray *words = [sentence componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

[words enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id word, NSUInteger idx, BOOL *stop){ 
    NSString *transformedWord = [obj method:word]; 
}]; 

L'altro metodo, –makeObjectsPerformSelector:withObject:, non funzionerà per voi. Si aspetta di essere in grado di chiamare [word method:obj] che è indietro rispetto a quello che ti aspetti.

+0

Per alcune lingue come cinese, giapponese, tedesco, lo spazio bianco non è un limitatore evidente tra le parole, quindi l'approccio di Ken è corretto. – Krodak

1

Se si potesse scrivere i criteri con le espressioni regolari, allora si potrebbe probabilmente fare un'espressione regolare che corrisponde a prendere queste parole e poi passarli al metodo convert:.

Si potrebbe anche eseguire una divisione di stringa in una serie di parole utilizzando componentsSeparatedByString: o componentsSeparatedByCharactersInSet:, quindi passare sopra le parole nell'array e rilevare se corrispondono ai criteri in qualche modo. Se si adattano, quindi passarli a convert:.

Spero che questo aiuti.

-1

Si consiglia di utilizzare un ciclo while per passare attraverso la stringa in questo modo.

NSRange spaceRange = [sentenceContainingWords rangeOfString:@" "]; 
NSRange previousRange = (NSRange){0,0}; 
do { 
    NSString *wordString; 
    wordString = [sentenceContainingWord substringWithRange:(NSRange){previousRange.location+1,(spaceRange.location-1)-(previousRange.location+1)}]; 
    //use the +1's to not include the spaces in the strings 
    [self convert:wordString]; 
    previousRange = spaceRange; 
    spaceRange = [sentenceContainingWords rangeOfString:@" "]; 
} while(spaceRange.location != NSNotFound); 

Questo codice avrebbe probabilmente bisogno di essere riscritto perché la sua piuttosto grezzi, ma si dovrebbe ottenere l'idea.

Modifica: Ho appena visto il post di Jacob Gorban, dovresti assolutamente farlo in quel modo.

18

Per enumerare le parole in una stringa, è necessario utilizzare -[NSString enumerateSubstringsInRange:options:usingBlock:] con NSStringEnumerationByWords e NSStringEnumerationLocalized. Tutti gli altri metodi elencati utilizzano un mezzo per identificare le parole che potrebbero non essere appropriate alle impostazioni internazionali o corrispondere alla definizione del sistema. Ad esempio, due parole separate da una virgola ma non da spazi bianchi (ad esempio "foo, bar") non saranno trattate come parole separate da nessuna delle altre risposte, ma sono presenti nelle visualizzazioni di testo Cocoa.

[aString enumerateSubstringsInRange:NSMakeRange(0, [aString length]) 
          options:NSStringEnumerationByWords | NSStringEnumerationLocalized 
         usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop){ 
    if ([substring rangeOfString:@"ll" options:NSCaseInsensitiveSearch].location != NSNotFound) 
     /* do whatever */; 
}]; 

come documentato per -enumerateSubstringsInRange:options:usingBlock:, se lo si chiama su una stringa mutabile, si può mutare in modo sicuro la stringa viene enumerato all'interno del enclosingRange. Quindi, se vuoi sostituire le parole corrispondenti, puoi farlo con qualcosa come [aString replaceCharactersInRange:substringRange withString:replacementString].

Problemi correlati