Mentre il codice di Barry Wark funziona bene per l'inglese, non è il modo preferito per rilevare interruzioni di parole. Molte lingue, come il cinese e il giapponese, non separano le parole usando spazi. E il tedesco, per esempio, ha molti composti che sono difficili da separare correttamente.
Ciò che si vuole utilizzare è CFStringTokenizer:
CFStringRef string; // Get string from somewhere
CFLocaleRef locale = CFLocaleCopyCurrent();
CFStringTokenizerRef tokenizer = CFStringTokenizerCreate(kCFAllocatorDefault, string, CFRangeMake(0, CFStringGetLength(string)), kCFStringTokenizerUnitWord, locale);
CFStringTokenizerTokenType tokenType = kCFStringTokenizerTokenNone;
unsigned tokensFound = 0, desiredTokens = 10; // or the desired number of tokens
while(kCFStringTokenizerTokenNone != (tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer)) && tokensFound < desiredTokens) {
CFRange tokenRange = CFStringTokenizerGetCurrentTokenRange(tokenizer);
CFStringRef tokenValue = CFStringCreateWithSubstring(kCFAllocatorDefault, string, tokenRange);
// Do something with the token
CFShow(tokenValue);
CFRelease(tokenValue);
++tokensFound;
}
// Clean up
CFRelease(tokenizer);
CFRelease(locale);
Mi hai battuto sopra: +1. Non dimenticare i componenti JoinedByString: poiché l'OP cercava un risultato NSString :) –
Funziona se la stringa ha solo 3 parole? Che cosa è wordIndexes? (appare inutilizzato nel primo esempio) – philfreo
Dovresti cambiare nWords se ci sono solo tre parole. Ovviamente potresti trovare i componenti SeparatedByString e contarli prima di decidere su nWords, ma non ne hai parlato come requisito nella tua domanda. –