web-dev-qa-db-ja.com

unicharとNSString-これらはどのように交換可能ですか?

NSStringメソッドがあります-characterAtIndex:は、unicharを返します。

  • (unichar)characterAtIndex:(NSUInteger)index

明らかにNSStringではないこのunicharをNSStringに変換したり、比較のためにNSStringにフィードしたりできるのでしょうか。

そして:NSStringは内部的にunicharアイテムの配列で構成されていますか?

34
HelloMoon

2つのオプションがあります。1つ目は、NSStringにstringWithUnicharメソッドを追加するカテゴリです。

@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 *

またはunicharの配列(C char *など)

Unicharは、文字を格納するために使用される16ビット値です。 8ビットしかない符号なしcharとは異なり、0〜255以上を保持できるため、16ビットのUnicode文字も保持できます。 NSStringは、unicharの配列を含むクラス(のクラス)です。

[〜#〜]編集[〜#〜]

以下は、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/

お役に立てば幸いです。

68
micmoo

別のオプションは、クラスメソッドを使用することです。

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

だからちょうど使用:

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

YourCharパラメーターはポインターでなければなりません。

4
Bjinse

NSStringは実際にはクラスクラスタです。つまり、コンテンツとサイズに基づくパフォーマンスや、NSStringを作成するときにCFStringへのフリーブリッジングをサポートするなど、さまざまな理由で、isKindOfにYESを返す多くのプライベートクラスの1つを実際に取得する可能性があります。 NSStringクラスのすべてのメソッドに応答します。これはプロトコルのようなものですが、すべてのオブジェクトはパブリックAPIのNSStringであり、実行されます。

ドキュメントでNSStringとCFStringについて述べているように、これは概念的にはUTF16 unicharの配列です。実装に利点がある場合は、別の内部表現を使用する場合があります。通常、パフォーマンスはメモリサイズです。しかし、頼まれたとき、またはAPIが約束する他の何かのときに、unicharのC配列を提供することに依存することができます。

成熟するまでには長い時間がかかり、ほとんどすべてのリリースで内部的に調整されています。

簡単に言えば、これは、UTF16 unicharの配列に支えられており、Unicode標準の論理文字列の記述とほぼ一致していると考えることができます。しかし、心に留めておくべきことは、何が入っているかを本当に心配する必要はないということです。

Unicodeの最高の実装の1つです。それがどのように機能するかについてのより完全な画像が必要な場合は、opensource.Apple.comでCFStringのソースの(ほとんど)を見ることができます。これはCおよびCore Foundation(オブジェクト指向C)であり、かなり様式化されているため、理解しないでください。一斉に。

NSStringとCFStringには、unicharから返して作成するメソッドがあります。ほとんどの人はほとんどの場合それらを必要とすべきではありません。行う場合は、注意して、たくさん読んで素朴な間違いをする準備をしてください。 Unicodeは大きなトピックです。それを正しく処理することは、そのレベルの科学と芸術です。これがNSStringの理由の1つです。それは多くの難しいものを処理するので、あなたがしたい、またはする必要がない限り、それほど頻繁にする必要はありません。

3
uchuugaka