Поскольку вы упомянули, что пытались сделать это с помощью stringByTrimmingCharactersInSet:, было бы интересно узнать, что на самом деле существует способ сделать это только с вызовами фреймворка.Заимствуя установочный код у Джейсона
NSString* theString = // assume this exists
NSMutableCharacterSet* testCharSet = [[NSMutableCharacterSet alloc] init];
[testCharSet formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]];
[testCharSet formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]];
, вы могли бы затем обрезать цикл for примерно так:
NSArray *nonComp = [theString componentsSeparatedByCharactersInSet:testCharSet];
Это будет разбивать строку на части в каждом индексе, где он находит символиз кодировки, создавая массив из оставшихся частей.Затем вы можете использовать Key-Value Coding для суммирования свойства длины всех кусочков:
NSNumber *numberOfNonANChars = [nonComp valueForKeyPath:@"@sum.length"];
или вместо этого снова склеить кусочки и сосчитать длину:
NSUInteger nonANChars = [[nonComp componentsJoinedByString:@""] length];
Но: разделение компонентов создаст массив и строки, которые не нужны после подсчета - бессмысленное выделение памяти (то же самое касается компонентовJoinedByString :).И использование valueForKeyPath: для этого очень простого суммирования также кажется гораздо более дорогостоящим, чем просто перебор исходной строки.
Код может быть немного более объектно-ориентированным или даже менее подверженным ошибкам, но в обоих случаяхпроизводительность будет на порядок хуже, чем у кода Джейсона.Таким образом, в этом случае старый добрый цикл for превыше всего (поскольку используемые методы не предназначены для этого) функциональных возможностей фреймворка.