2009-08-30 2 views
31

Существует NSString метод -characterAtIndex:, который возвращает unichar.unichar и NSString - насколько они взаимозаменяемы?

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

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

И: Есть ли NSString внутренне только из массива изделий unichar?

ответ

63

У вас есть два варианта: первый категория добавления метода 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 полукокса *)

unichar просто значение 16 бит, которое используется для хранения символа. В отличие от символа unsigned, который имеет только 8 бит, он может содержать более 0-255, поэтому он может содержать символы юникода, а также 16 бит. NSString является (кластером) классом [ы], который содержит массив 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/

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

+0

вы забыли @ перед «TestString»? – newacct

+0

Я знал, что что-то не выглядело правильно ... спасибо! – micmoo

4

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

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

Так просто с помощью:

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

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

2

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

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

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

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

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

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

Смежные вопросы