[Swift] Swiftでも文字列操作 Substringの扱い方

Swift

     

TAGS:

⌛️ < 1 min.

Swift では、文字列操作のための便利な方法が揃っています。ここでは、文字列から、その一部分の文字列を抜き出す方法を説明します。

String の Conform するプロトコル

Swift5では、String は、多くのプロトコルに準拠しています。

Appleのこのドキュメント参照

ポイントは、BidirectionalCollection というプロトコルです。日本語にすると、前後両方向に辿ることができる(走査できる)集合という感じでしょうか。

このプロトコルに、双方向に走査可能な要素に対する操作が定義されています。

String での文字列抜き出し操作

基本的な文字列抜き出し操作: Rangeを使って

基本的には、Range という要素を使って、文字列のどの文字からどの文字までを抜き出すかを指定します。

subscriptというメソッドを使用します。

Subscript というキーワードで意識して書いたことはないかもしれませんが、いわゆる”[]”を使って範囲指定することです。

subscriptによる文字列抽出


let originalString = "012345678"
let startIndex = originalString.firstIndex(of: "4")!
let endIndex = originalString.lastIndex(of: "6")!
let substring = originalString[ startIndex ... endIndex ]
print(substring)
// result : 456

自分の欲しい範囲を探すためには、以下のような関数を使うことができます。

firstIndex(of: Character) -> Index?
最初に見つかった指定文字のIndex(見つからなければnil)
lastIndex(of: Character) -> Index?
最後に見つかった指定文字のIndex

上記の関数は、文字そのものを指定する方法以外に、Closure を渡して、指定文字かどうかを判断させることもできます。

その他の String から一部を抜き出す操作

dropFirst(k)
最初のk文字を削除した文字列
dropLast(k)
最後のk文字を削除した文字列

文字列を分割する操作

特定のセパレータ(例えば、”,”等)が含まれていることがわかっているケースでは、文字列を分割することでも期待する範囲の文字列を取得することができます。

func split(separator: Character, maxSplits: Int, omittingEmptySubsequences: Bool) -> [Substring]

指定文字列をセパレータとして、文字列を複数の文字列に分割します

Substring の扱い方

上記の方法で文字列から、特定の文字列を抜き出すことができますが、それをそのまま String として使用できません。

上記の関数の返り値は、Substring となっていることが確認できます。

この値をそのまま String として扱うことはできず以下のように、String として変換しないといけません。

コード


let originalString = "012345678"
let startIndex = originalString.firstIndex(of: "4")!
let endIndex = originalString.lastIndex(of: "6")!
let substring = originalString[ startIndex ... endIndex ]
// function(substring) // String を引数として受け取る function であれば、エラー
function( String(substring) ) // 

文字列の中身をチェックして という操作は、Substring のままでも行えます。というかそのような操作を効率的に行うためにSubstringは存在しています。

ただ、String として扱うためには、上記のような変換が必要となります。

説明は以上です。

Swift おすすめ本

Swift を深く理解するには、以下の本がおすすめです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です