Si bien el código de Barry Wark funciona bien para el inglés, no es la forma preferida de detectar saltos de palabra. Muchos idiomas, como el chino y el japonés, no separan palabras usando espacios. Y el alemán, por ejemplo, tiene muchos compuestos que son difíciles de separar correctamente.
Lo que se quiere utilizar es 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);
Me ganaste: +1. No olvide los componentesJoinedByString: dado que el OP estaba buscando un resultado de NSString :) –
¿Funciona esto si la cadena solo tiene 3 palabras? ¿Qué es wordIndexes? (parece no utilizado en el primer ejemplo) – philfreo
Tendría que cambiar nWords si solo hay tres palabras. Podría, por supuesto, encontrar los componentes SeparatedByString y contarlos antes de decidir sobre nWords, pero no mencionó eso como un requisito en su pregunta. –