Более эффективный метод, чем разделение, - проверять строку символ за символом.
int word_count(NSString* s) {
CFCharacterSetRef alpha = CFCharacterSetGetPredefined(kCFCharacterSetAlphaNumeric);
CFStringInlineBuffer buf;
CFIndex len = CFStringGetLength((CFStringRef)s);
CFStringInitInlineBuffer((CFStringRef)s, &buf, CFRangeMake(0, len));
UniChar c;
CFIndex i = 0;
int word_count = 0;
Boolean was_alpha = false, is_alpha;
while (c = CFStringGetCharacterFromInlineBuffer(&buf, i++)) {
is_alpha = CFCharacterSetIsCharacterMember(alpha, c);
if (!is_alpha && was_alpha)
++ word_count;
was_alpha = is_alpha;
}
if (is_alpha)
++ word_count;
return word_count;
}
По сравнению с решением @ ennuikiller подсчет строки из 1 000 000 слов занимает:
- 0,19 секунды, чтобы построить строку
- 0,39 секунды, чтобы построить строку + подсчет, используя мой метод.
- 1,34 секунды для построения строки + подсчет по методу ennuikiller.
Большим недостатком моего метода является то, что он не является однострочным.