文字列から文字や部分文字列を取り出す

Swiftでは、文字列からひとつの文字や部分文字列(substring)を取り出したり、置き換えたりするに場合に、範囲の指定にインデックス(Index型:String.CharacterView.Indexのtypealias)を使用します。

■ 最初の文字にアクセスする

指定したインデックスの文字は次のようにして取り出せます。

文字列[インデックス]

ここで、インデックスはIndex型の値であり、整数値(Int型)ではないことに注意しください。
最初の文字のインデックス(先頭から0番目の文字)は、String型のstartIndexプロパティでアクセスできます。文字列strから次に最初の文字を取り出して表示する例を示します。

let str = "こんにちはSwift"
var currentIndex = str.startIndex
print(str[currentIndex]) // "こ"

■ インデックスを進める/戻す

インデックスをひとつ進めるにはindex(after:)メソッドを使用します。

let str = "こんにちはSwift"
var currentIndex = str.startIndex
currentIndex = str.index(after:currentIndex)
print(str[currentIndex]) // "に"

逆に、インデックスをひとつ戻すにはindex(before:)メソッドを使用します。たとえばString型のendIndexプロパティでは最後の文字の「インデックス+1」が戻されます。したがって最後の文字を表示するにはひとつもどして次のようにします。

let str = "こんにちはSwift"
var currentIndex = str.endIndex
currentIndex = str.index(before:currentIndex)
print(str[currentIndex]) // "t"

■ インデックスを移動する

インデックスを指定した値だけ移動するにはindex(_, offsetBy:)メソッドを使用します。第二引数にはマイナスの数値を指定することも可能です。

let str = "こんにちはSwift"
var currentIndex = str.endIndex
currentIndex = str.index(str.endIndex, offsetBy: -4)
print(str[currentIndex]) // "w"

■ 部分文字列を取り出す

文字列の先頭から指定した位置までの部分文字列を取り出すにはString型のsubstring(to:)メソッドを使用します。

let str = "こんにちはSwift"
var currentIndex = str.index(str.endIndex, offsetBy: -5)
var subStr = str.substring(to:currentIndex) // "こんにちは"

文字列の定した位置から最後までの部分文字列を取り出すにはString型のsubstring(from:)メソッドを使用します。

let str = "こんにちはSwift"
var currentIndex = str.index(str.startIndex, offsetBy: 5)
var subStr = str.substring(from:currentIndex) // "Swift"

範囲を指定して部分文字列を取り出すにはsubstring(with:)メソッドを使用します。範囲はRange型の値で指定します。次に先頭から3文字目から、終わりから4文字目までを取り出す例を示します。

let str = "こんにちはSwift"
var startIndex = str.index(str.startIndex, offsetBy: 2)
var endIndex = str.index(str.endIndex, offsetBy: -3)
var range = startIndex..<endIndex
var substr = str.substring(with: range) // "にちはSw"

■ 文字/文字列を削除する

指定したインデックスの文字を削除するにはremove(at:)メソッドを使用します。

var str = "こんにちはSwift"
var startIndex = str.index(str.startIndex, offsetBy: 2)
str.remove(at: startIndex) // "こんちはSwift"

指定した範囲の部分文字列を削除するにはremoveSubrange(_:)メソッドを使用します。

var str = "こんにちはSwift"
var startIndex = str.index(str.startIndex, offsetBy: 2)
var endIndex = str.index(str.endIndex, offsetBy: -3)
var range = startIndex..<endIndex
str.removeSubrange(range) // "こんift"

■ 部分文字列を置き換える

指定した範囲の部分文字列を別の文字列で置き換えるにはreplaceSubrange(_:with:)メソッドを使用します。置き換える文字列の長さは元の文字列と違っていても構いません。
「”こんにちはSwift”」の「”Swift”」を「”Objective-C”」に変更するには次のようにします。

var str = "こんにちはSwift"
var startIndex = str.index(str.startIndex, offsetBy: 5)
var endIndex = str.index(str.endIndex, offsetBy: 0)
var range = startIndex..<endIndex
str.replaceSubrange(range, with: "Objective-C") // "こんにちはObjective-C"

■ 文字列内を検索する

文字列内の文字を検索しインデックスを求めるcharactersプロパティ(String.CharacterView型)を取得しindex(of:)メソッドを使用します。前の例を変更し、「”こんにちはSwift”」から「”S」の位置をindex(of:)メソッドで見つけて、「”Swift”」を「”Objective-C”」に変更するには次のようにします。

var str = "こんにちはSwift"
var startIndex = str.characters.index(of: "S") // ←「S」のインデックスを戻す
var endIndex = str.index(str.endIndex, offsetBy: 0)
var range = startIndex!..<endIndex
str.replaceSubrange(range, with: "Objective-C") // "こんにちはObjective-C"