2012-06-23 11 views
5

Ich möchte eine NSString durchlaufen Schleife und rufen Sie eine benutzerdefinierte Funktion für jedes Wort, das bestimmte Kriterium hat (zum Beispiel "hat 2 'L's"). Ich fragte mich, was der beste Weg war, dem zu begegnen. Sollte ich Find/Replace-Muster verwenden? Blöcke?Rufen Sie eine Methode für jedes Wort 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. 
} 

Antwort

2

Die beiden Möglichkeiten, die ich kenne eine Reihe von Schleifen, die für Sie arbeiten, sind wie folgt:

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

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

und

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

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

Die andere Methode, –makeObjectsPerformSelector:withObject:, wird für Sie nicht funktionieren. Es erwartet, [word method:obj] aufrufen zu können, was rückwärts von dem ist, was Sie erwarten.

+0

Für einige Sprachen wie Chinesisch, Japanisch, Deutsch, Whitespace ist nicht offensichtlich Begrenzer zwischen Wörtern, daher Ken Ansatz ist der richtige. – Krodak

1

Wenn Sie Ihre Kriterien mit regulären Ausdrücken schreiben könnten, dann könnte man wahrscheinlich einen regulären Ausdruck tun passenden, diese Worte zu holen und sie dann zu Ihrer convert: Methode übergeben.

Sie könnten auch eine Teilung der Zeichenfolge in ein Array von Wörtern mit componentsSeparatedByString: oder componentsSeparatedByCharactersInSet: tun, dann gehen Sie über die Wörter im Array und erkennen, ob sie irgendwie Ihren Kriterien entsprechen. Wenn sie passen, geben Sie sie an convert: weiter.

Hoffe, das hilft.

-1

Ich würde empfehlen, eine while-Schleife zu verwenden, um durch die Zeichenfolge wie folgt zu gehen.

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); 

Dieser Code müßte wahrscheinlich, weil seine ziemlich rau neu geschrieben werden, aber man sollte die Idee.

Edit: Just sah Jacob Gorbans Beitrag, sollten Sie es auf jeden Fall so machen.

18

Um die Wörter in einer Zeichenfolge aufzulisten, sollten Sie -[NSString enumerateSubstringsInRange:options:usingBlock:] mit NSStringEnumerationByWords und verwenden. Alle anderen aufgelisteten Methoden verwenden ein Mittel zum Identifizieren von Wörtern, die möglicherweise nicht Gebietsschema-geeignet sind oder der Systemdefinition entsprechen. Beispielsweise werden zwei Wörter, die durch ein Komma getrennt sind, aber nicht durch Leerzeichen (z. B. "foo, bar"), von keiner der anderen Antworten als separate Wörter behandelt, sondern in Cocoa-Textansichten.

[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 */; 
}]; 

Was -enumerateSubstringsInRange:options:usingBlock: dokumentiert, wenn Sie es auf einem wandelbaren String aufrufen, können Sie sicher die Zeichenfolge mutieren innerhalb der enclosingRange aufgezählt werden. Also, wenn Sie die passenden Wörter ersetzen möchten, können Sie mit etwas wie [aString replaceCharactersInRange:substringRange withString:replacementString].

Verwandte Themen