String型データから部分文字列を取り出す

投稿者: | 2017年3月13日

datecountもmkpass同様、コマンド引数を読んで振る舞いを変えなくてはいけないので、Conditionというクラスを作りました。今回は与えられた文字列を適宜分割する処理を入れました。

Conditionクラスで使った部分文字列取り出しコード部は以下のとおり。メソッドの引数である8桁の数字列dateStringに対して、クラスのプロパティであるtargetYearに先頭4桁を年として、targetDayに終端2桁を日として、targetMonthに中間2桁を月のデータとして切り出しています。

let yearIndex = dateString.index(dateString.startIndex, offsetBy:4)
let dayIndex = dateString.index(dateString.endIndex, offsetBy:-2)
let monthIndex = dateString.index(after:yearIndex)
let range = monthIndex..<dayIndex
targetYear = Int(dateString.substring(to:yearIndex))!
targetMonth = Int(dateString.substring(with:range))!
targetDay = Int(dateString.substring(from:dayIndex))!

ConditionクラスおよびそのテストコードはGitHubに置いておきます。

部分文字列の取り出し

substring()メソッドを使用することでString型のデータから部分文字列を取り出すことができます。targetStringからsubStringを取り出す方法として以下の3種類があります。

  1. 文字列の先頭から指定位置までを取り出す
    subString = targetString.substring(to:indicatedPosition)
    先頭部分文字列
  2. 文字列の終端から指定位置までを取り出す
    subString = targetString.substring(from:indicatedPosition)
    終端部分文字列
  3. 文字列の範囲(開始位置と終了位置)を指定して取り出す
    subString = targetString.substring(with:indicatedRange)
    中間部分文字列

このとき指定位置または範囲を示すindicatedPositionまたはindicatedRangeはIndex型のデータです。

Indexの操作

じゃあIndex型のデータはどのように指定するのか。その方法を説明します。

  1. String型のデータがデフォルトで持っているIndex型プロパティ
    targetString.startIndex:対象文字列の先頭位置(startIndexプロパティ)
    targetString.endIndex:対象文字列の終端位置(endIndexプロパティ)
  2. index()メソッドによるIndexの移動
    targetString.index(after:indexPosition):対象文字列の指定位置(indexPosition)のひとつ後ろの位置(.index(after:)メソッド)
    targetString.index(before:indexPosition):対象文字列の指定位置(indexPosition)のひとつ前の位置(.index(before:)メソッド)
    targetString.index(targetString.indexPosition, offsetBy: n):対象文字列の指定位置(indexPosition)からn離れた(正なら後ろ、負なら前)位置(.index(, offsetBy:)メソッド)
  3. 開始位置と終了位置によるIndex範囲指定
    indicatedRange = headIndex..<tailIndex:開始位置(headIndex)から終了位置(tailIndex)までの範囲
    部分文字列インデックス

こんな感じで必ず存在するstartIndexやendIndexをもとにindex()メソッドで必要な場所のIndexを生成してからsubstring()メソッドを使って部分文字列を取り出します。なんか面倒くさいね。

コメントを残す

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