前回前々回の記事で、Swiftにおける文字列の切り出しについてインデックスを使用しなければいけないことを説明した。

今回は他言語でsubstring関数として使われている、文字列の中から範囲を指定して任意の文字列を取り出す方法を紹介する。

レンジ演算子を使って範囲指定をする

インデックスの開始位置と終了位置をあらかじめ設定し、レンジ演算子を使うことで任意の複数文字を取り出すことができる。

基本的な例を見てみよう。

let str = "Swift入門"

let zero = str.startIndex
let start = str.index(zero, offsetBy: 3)
let end = str.index(zero, offsetBy: 5)

// 先頭から3文字先(4文字目)から5文字先(6文字目)までの範囲
let str1 = str[start...end]

print(str1)
// ft入

まず、対象文字列の先頭文字のインデックスを取得し、zeroへ代入する。

次にindexメソッドを使って、startとendに取り出したい文字の位置を代入する。

最後にレンジ演算子を使ってインデックスの範囲指定をおこなえば、任意の文字列を取り出すことができる。

オリジナルのsubstring関数を作る

ここで紹介した文字列の範囲指定方法を応用し、substring関数を作ってみた。

let str = "Swift入門"

func swiftSubString(str: String, start: Int, length: Int) -> String {
    let zero = str.startIndex
    let s = str.index(zero, offsetBy: start)
    let e = str.index(s, offsetBy: length)
    
    return String(str[s..<e])
}

let substring = swiftSubString(str: str, start: 2, length: 3)
print(substring)
// ift

第一引数のstartには、何文字目から取り出すか(0から始まる数字)を、第二引数のlengthにはstartで指定した位置から何文字分取り出すかを指定する。

これで他言語でよく使われているsubstring関数と同じように扱うことができる。