文字列の先頭または末尾のTrim(Swift)
Oct 25, 2017 · iosswift3
SwiftでLTrim
やRTrim
相当の処理を行う方法
そもそも、Swiftの文字列ではTrim
そのもののメソッドはないので、
let text = " hoge ".trimmingCharacters(in: .whitespaces)
でトリムを行うが、これでは、文頭も文末も両方とも空白が削除されてしまう
(例だとhoge
という結果になる)
文頭だけ、または文末だけトリムしたい場合は自前で実装が必要となるが、Swiftっぽい実装なのでメモしておく
コード
今回は以下の様にString
のextension
として実装。
また、既存のtrimmingCharacters
と同等に使える様にキャラセットは指定する方法にしている
処理としては、文字列を先頭から末尾(または末尾から先頭)へ1文字ずつ走査していき、指定した文字種別以外であればその文字から残りの部分までを切り出している
文字種別の判断
今回の実装で一番難しかったのは、文字が指定した文字セットに含まれているかどうかの判定部分
従来のNSCharacterSet
であれば、characterIsMember
やlongCharacterIsMember
で、チェックすることができたが、SwiftのCharacterSet
には存在していない
これをSwiftで行っているのが、
let isMatch = c.element.unicodeScalars.contains { set.contains($0) }
の箇所となる。c.element
はCharacter
型で「1文字分」の文字が入っているが、unicodeの場合はこの「1文字分」が文字通りの1文字であるとは限らない(詳細は結合文字でググる)。。。
それで、そのCharacter
1文字を構成するunicode文字すべてをunicodeScalars
で取得してから、それぞれが文字セットに含まれるかどうかの比較が必要となる
このあたりは、Swiftがバカ真面目にunicodeに対応しているので、仕方が無いけどもうちょっと何とかなるとありがたいところだと思う
(いつかは落とし穴にはまるので、本来はちゃんと文字コードの仕組みを把握しないといけないけど、そこまでのレベルはめったに使うものでないので・・・)
参考リンク
いずれもSwiftのバージョンが古いので内容が若干変わっている可能性あり
開発環境
- Xcode 8.3 / 9