Как бы я разложить NSString на отдельных символов? - PullRequest
2 голосов
/ 30 октября 2010

Итак, у меня есть метод, который принимает NSString в качестве аргумента, и я хотел бы, чтобы этот метод в основном разлагал этот тип на отдельные символы и сохранял их в массиве (NSArray).

Другими словами, я хотел бы прочитать каждый символ в строке и сохранить отдельные символы в массиве и в том же порядке, чтобы я мог обрабатывать отдельные символы позже.

Есть мысли?

Ответы [ 3 ]

7 голосов
/ 30 октября 2010

Перебирайте строку, используйте characterAt - и добавляйте каждый символ в NSMutableArray.

Но если вы делаете это - зачем вообще их помещать в NSArray?

NSMutableArray *myArray = [[NSMutableArray] alloc] initWithCapacity:[string length]];

for (i=0;i<[string length];i++) {
  unichaar ch;
  ch = [string  characterAtIndex:i];
  NSLog(@"Processing charachter %c",ch);

   // If you really want
  [myArray addObject:(id) ch];
}
1 голос
/ 28 октября 2013

Я обычно не такой осуждающий, но текущие ответы будут работать ... пока они не будут!

В ObjC / Foundation существует только один способ перечисления фактических символов Юникода:

- (void)enumerateSubstringsInRange:(NSRange)range options:(NSStringEnumerationOptions)opts usingBlock:(void (^)(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop))block

с использованием параметра

NSStringEnumerationByComposedCharacterSequences

Проблема, которая лучше всего иллюстрируется с помощьюEmoji:

? (имя Unicode: PILE OF PO, кодовая точка: U + 1F4A9) равно 0xD83DDCA9, если оно представлено как UTF-16 Cocoa / Foundation / CoreFoundation для внутреннего использования.Вы получите две (поврежденные, недействительные) записи с другими методами.

Если ваши строки длинные и производительность становится проблемой, а память - нет, вы можете использовать UTF-32 и снова получить доступ кперсонажи в постоянном времени.Просто сохраните их в массиве C или в векторе C ++.Или просто оберните 32-битные значения в NSNumber и используйте NSArray, если производительность не так уж критична ...

Я настоятельно рекомендую прочитать NSString и Unicode из objc.io, выпуск № 9.

Редактировать 2016-05-15: Термин «персонаж» в этом контексте не имеет четкого определения и может вводить в заблуждение.То, что я называю выше как «символ», на самом деле является кодовой точкой Unicode.Swift делает все правильно и определяет символ как «то, что пользователь считает символом».

0 голосов
/ 30 октября 2010

Помимо ответа Брэда (где он показывает, что вы, безусловно, можете хранить каждый символ в экземпляре NSArray, если хотите), у вас также есть более простая возможность получить значение NSString в виде простого старого C null завершенная строка . Таким образом, вы можете повторить это так:

char c;
int i = 0;
const char *buffer = [nsstringInstance cStringUsingEncoding:NSASCIIStringEncoding];
while (c = buffer[i++]) {
    // iterating using c char

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...