Posted at

SwiftのString.CharacterViewとそれをArray化したものの違い

More than 1 year has passed since last update.

[swift] String.CharacterViewが使いづらいと思う、そんなあなたにArrayのおすすめ - Qiitaを拝読して気になることがあったので調べてみました。

let w = "\u{65}\u{301}"                 // "é" == e + アクセントマーク

let wcv = w.characters
let wcv_endIndex = wcv.endIndex // 2

let wcv_a = Array(wcv) // ["é"]
let wcv_a_endIndex = wcv_a.endIndex // 1

let wcv_c0 = wcv[wcv.index(wcv.startIndex, offsetBy: 0)] // "é"
let wcv_c1 = wcv[wcv.index(wcv.startIndex, offsetBy: 1)] // fatal error: Can't form a Character from an empty String

"é"のcharactersのendIndexは2ですがArrayにしたら1になりました。しかし文字を取得しようとするとfatal errorになりました。

\u{301}のような特殊文字の扱いが問題になるのでCharacterView.IndexはStrideableにできないということでしょうか?

詳しい方に解説をお願いしたいところです。