unichar и NSString - насколько они взаимозаменяемы? - PullRequest
34 голосов
/ 30 августа 2009

Существует NSString метод -characterAtIndex:, который возвращает unichar.

  • (unichar) characterAtIndex: (NSUInteger) индекс

Интересно, может ли этот unichar, который, очевидно, не является NSString, быть преобразован в NSString или передан в NSString для сравнения?

И: * Внутренне NSString состоит только из массива уникальных предметов?

Ответы [ 3 ]

67 голосов
/ 30 августа 2009

У вас есть две опции: первая - это категория, добавляющая метод stringWithUnichar к NSString:

@interface NSString (MNNSStringWithUnichar)
+ (NSString *) stringWithUnichar: (unichar) value;
@end


@implementation NSString (MNNSStringWithUnichar)

+ (NSString *) stringWithUnichar:(unichar) value {
     NSString *str = [NSString stringWithFormat: @"%C", value];
     return str;
}

@end

Тогда назовите это с

NSString *otherString = @"TestString";

NSString *str = [NSString stringWithUnichar:[otherString characterAtIndex:1]];

или вы могли бы просто пойти прямо так:

NSString *str = [NSString stringWithFormat:@"%C",[otherString characterAtIndex:1]];

Выберите категорию, если вы хотите использовать ее повторно, или если вам нужно сделать это только один раз, используйте пример stringWithFormat !!

Не уверен насчет внутренних функций NSString, но я предполагаю, что это, вероятно, оболочка

unichar *

или массив unichars (например, C char *)

Unichar - это просто 16-битное значение, которое используется для хранения символа. В отличие от неподписанного символа, который имеет длину всего 8 бит, он может содержать более 0-255 символов, поэтому он может содержать и символы Юникода, то есть 16 бит. NSString - это (кластер) класса [es], который содержит массив unichars

EDIT

Вот несколько статей о том, что люди думают о NSString:

http://cocoawithlove.com/2008/08/string-philosophies-char-arrays.html

http://www.reddit.com/r/programming/comments/6v1yw/string_philosophies_char_arrays_stdstring_and/

Надеюсь, это поможет!

4 голосов
/ 19 декабря 2012

Другой вариант - использовать метод класса:

+ (id)stringWithCharacters:(const unichar *)characters length:(NSUInteger)length;

Так что просто используя:

yourString = [NSString stringWithCharacters: &yourChar length: 1];

Параметр yourChar должен быть указателем.

3 голосов
/ 08 апреля 2014

NSString действительно кластер классов. Это означает, что по разным причинам, включая производительность в зависимости от содержимого и размера, а также для поддержки бесплатного моста через CFString при создании NSString, вы можете получить один из многих частных классов, которые возвращают YES для isKindOf: когда вы спрашиваете, является ли это NSString и он будет отвечать на все методы в классе NSString. Это похоже на протокол, но все объекты будут говорить, делать и быть NSString в общедоступном API.

Как указано в документации для NSString и CFString, это концептуально массив UTF16 unichar Он может и будет использовать другое внутреннее представление, где он представляет преимущество для реализации. Обычно производительность иногда объем памяти. Но вы можете положиться на него, предоставляя вам массив C unichar, когда его попросят, или что-нибудь еще, что обещает API.

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

Короче говоря, да, вы можете думать об этом как о поддержке массива UichFich Unichar, в значительной степени совпадающего с описанием логической строки в стандарте Unicode. Но нужно помнить, что вам действительно не нужно беспокоиться о том, что внутри, а только о том, что вам сказано, что внутри.

Это одна из лучших реализаций Юникода. Если вы хотите получить более полную картину того, как это работает, вы можете посмотреть (большинство) источника CFString на opensource.apple.com Это C и Core Foundation (объектно-ориентированный C) и довольно стилизованный, так что не ждите, что поймете все сразу.

NSString и CFString имеют методы для возврата и создания из unichar. Большинству людей это не нужно. Если вы делаете, будьте осторожны, будьте готовы много читать и делать наивные ошибки. Юникод это большая тема. Правильное обращение с этим - наука и искусство на этом уровне. Это одна из причин NSString. Он обрабатывает много сложных вещей, поэтому вам не придется так часто, если вы не хотите или не должны.

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