2016-06-16 13 views
3

Swift文字列を整数値でインデックスできないことを知りました。私はそれを思い出し、私はそのルールを使用します。しかし、私はそれの背後にあるメカニックを完全に理解したことはありません。文字列を整数値でインデックスできない理由

特定の位置にある文字を決定するために、あなたは各ユニコードを反復しなければならないので、

異なる文字は、格納するメモリの異なる量を必要とすることができ、次のように公式文書からの説明がありますスワイプの文字列を整数値でインデックス化することはできません。 "

私はそれを何度も読んだことがありますが、まだそれほど意味がありません。なぜSwift Stringを整数値で索引付けできないのか誰かが私に説明してくれますか?

ありがとうございました

+0

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html - これはあなたが話しているトピックです。私にとっては、このトピックを最初から最後まで読むときよりもはっきりと説明するのはかなり難しいでしょう。 –

+4

簡単なヒントでは完全な説明ではありません:スウィフト文字列はユニコードを尊重します。例えば、いくつかの絵文字は「合成」文字ですが、1文字として表示されますが、実際には最大4文字まで使用できます。それを見ると、表示されたときに複数の文字が1つに合成されます。そのため、Swiftの文字列の文字の「インデックス」に頼ることができません。 – Moritz

+0

@Moritz、これは、整数索引を実装することができない理由を説明しています。なぜなら、整数索引を対応するUnicodeコードポイントにマッピングして実装することはできませんが、myString [8] 'myString'の7番目の正規シンボルです。 あなたのヒントは絶対に正しいですが、以上の理由で私と他の人たちも質問を探します。 –

答えて

1

文字列は、バイト配列としてメモリに格納されます。

基本的なコードポイントには1〜4バイトを加え、任意の数の分音記号を組み合わせることができます。

たとえば、éには2バイトが必要です。あなたは、文字列efghéfghを持っている場合

さて、最初の文字列を、文字はインデックス1でバイト配列であり、二番目の文字(f)にアクセスするために、2番目の文字列のために、それはインデックス2であります。

これを知るには、最初の文字を検査する必要があります。そのインデックスに基づいて任意の文字にアクセスするには、前のすべての文字を調べて、それぞれのバイト数を知る必要があります。

+0

文字は4バイトよりも広いことができます。 "g͇̫͛͆̾ͫ̑͆" .characters.count == 1 && "g͇̫͛͆̾ͫ̑͆" .lengthOfBytes(.utf8を使用)== 17' –

+0

@BrianNickelはい、発音区別記号を追加して組み合わせることはできません。 (私の例では、éは独立した文字としても存在します)。ただし、各コードポイントは1〜4バイトでエンコードされます。 – njzk2

関連する問題