文字列の先頭または末尾のTrim(Swift)

SwiftでLTrimRTrim相当の処理を行う方法

そもそも、Swiftの文字列ではTrimそのもののメソッドはないので、

let text = " hoge ".trimmingCharacters(in: .whitespaces)

でトリムを行うが、これでは、文頭も文末も両方とも空白が削除されてしまう (例だとhogeという結果になる)

文頭だけ、または文末だけトリムしたい場合は自前で実装が必要となるが、Swiftっぽい実装なのでメモしておく

コード

今回は以下の様にStringextensionとして実装。 また、既存のtrimmingCharactersと同等に使える様にキャラセットは指定する方法にしている

処理としては、文字列を先頭から末尾(または末尾から先頭)へ1文字ずつ走査していき、指定した文字種別以外であればその文字から残りの部分までを切り出している

文字種別の判断

今回の実装で一番難しかったのは、文字が指定した文字セットに含まれているかどうかの判定部分

従来のNSCharacterSetであれば、characterIsMemberlongCharacterIsMemberで、チェックすることができたが、SwiftのCharacterSetには存在していない

これをSwiftで行っているのが、

let isMatch = c.element.unicodeScalars.contains { set.contains($0) }

の箇所となる。c.elementCharacter型で「1文字分」の文字が入っているが、unicodeの場合はこの「1文字分」が文字通りの1文字であるとは限らない(詳細は結合文字でググる)。。。
それで、そのCharacter1文字を構成するunicode文字すべてをunicodeScalarsで取得してから、それぞれが文字セットに含まれるかどうかの比較が必要となる

このあたりは、Swiftがバカ真面目にunicodeに対応しているので、仕方が無いけどもうちょっと何とかなるとありがたいところだと思う (いつかは落とし穴にはまるので、本来はちゃんと文字コードの仕組みを把握しないといけないけど、そこまでのレベルはめったに使うものでないので・・・)

参考リンク

いずれもSwiftのバージョンが古いので内容が若干変わっている可能性あり

開発環境