[iOSDC Japan 2019 リポート]「Stringの文字の数え方を完全理解する」というセッションを聞いてきました

2019.09.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

[イベントレポート]Stringの文字の数え方を完全理解する

iOSDCの前夜祭でフェンリルの廣部さんによる「SwiftのStringの文字の数え方を完全理解する」というセッションを聞きました。

SwiftはUnicodeの扱いに非常に長けた言語であり、絵文字を含む文字列でも正しい文字数を計算してくれます。 その反面、Unicodeの複雑さに引きずられてしまい、直感的な操作ができない時もあります。たとえば、 string[2] と書いても3番目の文字を取得することはできません。 そんな複雑なところのあるSwiftの文字列処理ですが、複雑なものを受け入れてきちんと理解するのはそこまで難しいものではありません。 このトークでは、Unicodeとの関係を意識しながら、Swiftの文字数の扱い方とその裏にある考え方を解説します。

SwiftのStringの文字の数え方を完全理解する - Speaker Deckより引用

印象に残ったところ & 感想

SwiftのStringはUnicodeの扱いに長けた言語である反面、Unicodeの複雑さに引きずられてしまっている部分があります。

このセッションを聞いてStringの文字の数え方の裏側について少し理解をすることができました。

ArrayとStringはともにCollection protocolにconformしています。

Arrayの方は添字へのアクセスをIntで行い要素を取り出すことができるのに対してStringはそれができません。添字にはString.startIndexを渡す必要があります。また、要素の型はCharacter型です。

getではなくsetを行う場合はArrayにはIntの添字を渡して値を代入すれば良いですが、Stringの場合は要素にアクセスして変更するためにはIntを渡せずString.Indexを渡す必要があります。

一つのCharactorの内部表現がそれぞれ異なるため、Intを使った場合取得と入れ替えの計算量がO(1)にならず、O(n)となるためIntで添字アクセスできず、MutableCollectionに準拠できないという内容でした。

また、それらを行うためIntではなく独自に定義した型を使って計算量O(1)を満たしているということでした。

String型の添字アクセスを行う時にString.Indexという型のオブジェクトを渡しているのに気づいてはいたもののそういうものとして扱っていたのでこのセッションはとても楽しいものに感じました。

最後に、発表をしていただいたTakanori Hirobe(@taka1068)さんさん、本当にありがとうございました。