UTF16View から String を生成する

Swift プログラミング

Swift で文字列を UTF16 で扱うときは String.UTF16View を使いますが、これを使ってサブ文字列を取得したり、再び String 型に変換する方法を調べてみました。

文字列を UTF16 で扱う

Swift言語 の文字列をUTF16 で扱いたいとき、String型 に用意されているutf16プロパティ を使います。

このプロパティにアクセスすると、String型 が持っている情報をUTF16 で表現したString.UTF16View型 が得られます。この中のUInt16型 で格納されているUTF16 コードユニットひとつひとつを配列のように扱えるようになっています。

UTF16 でのサブ文字列を取得する

このString.UTF16View型 は、内部で保持しているデータの場所をInt型 のインデックスで指定できるようになっています。

String型 そのもののような特殊なインデックス型を使う必要がないため、たとえば文字列をUTF16型 で見たときの 5 文字目から 12 文字目までを切り出したい場合は次のようにします。

let utf16s:String.UTF16View = str.utf16[5...12]
このようにサブスクリプト ([]) を使って切り出す範囲を指定すると、その範囲を切り出したデータをString.UTF16View型 で取得できます。

UTF16View を String に変換する

String.UTF16View型 で表現したUTF16 の文字列データを、Swift言語 で標準のString型 で表現したい場合には次のようにします。

let codes:[UInt16] = map(utf16s) { $0 }
let str = String(utf16CodeUnits:codes, count: countElements(codes))

このように、いったんmap関数 を使って、String.UTF16View型 からUInt16型 の配列を作り、それを使ってString型 を生成します。

toString関数 関数を使ってString型 に変換することもできそうに思ったのですけど、Xcode 6.1 ではなぜか、切り出す前の文字列全体が得られてしまう様子でした。