String.Index
Stringの中のそれぞれの文字(Character型)にアクセスするにはString.Index型の値を使用する。
StringはCharacterの双方向リストで構成されており、ランダムアクセスはに時間がかかる。
Indexを取得する
文字列からそのIndexを取得する場合は、まずstartIndexもしくはendIndexプロパティで最初か最後のIndexを取得する。
n番目のIndexを文字列から直接取得することはできない
let str = "ABCDEF"
let startIndex = str.startIndex // 文字列の最初のIndexを取得
let endIndex = str.endIndex // 文字列中の最後のIndexを取得
Indexを進める、戻る
文字列からn番目のIndexを直接取得することはできず、startIndex/endIndexから順々に辿って目的のIndexを得る。
Indexを次に進める/一つ前に戻る
let str = "ABCDEF"
let startIndex = str.startIndex
let nextIndex = startIndex.successor() // 次のIndexを取得する
let startIndex2 = nextIndex.predecessor() // 一つ前のIndexを取得する
n個先のIndexを取得する
advance()という関数を使う
let str = "ABCDEF"
let startIndex = str.startIndex
let idx4 = advance(startIndex, 4) // startIndexから3つ先にすすめる
Indexから文字を取得
Indexを使って以下のように対応する文字を取得することができる
let str = "ABC"
let idx0 = str.startIndex
let idx1 = idx0.successor()
let idx2 = idx1.successor()
str[idx0] // => 'A' Character型
str[idx1] // => 'B' Character型
srt[idx2] // => 'C' Character型
またfor文を使って文字をIterateすることもできる
let str = "ABC"
for s in str{
println("s \(s)")
}
//結果
//s A
//s B
//s C
部分文字列を取得
Stringから部分文字列を取得するメソッドは以下が用意されている
// index位置(を含む)から文字列の最後までの部分文字列を返す
func substringFromIndex(index: String.Index) -> String
// 文字列のはじめからindex位置の前までの部分文字列を返す
// index位置の文字は含まない
func substringToIndex(index: String.Index) -> String
// 与えられたindexの範囲の部分文字列を返す
func substringWithRange(aRange: Range<String.Index>) -> String
使用例
let str = "ABC"
let idx0 = str.startIndex
let idx1 = idx0.successor()
let idx2 = idx1.successor()
str.substringFromIndex(idx1) // => "BC"
str.substringToIndex(idx2) // => "AB"
// idx1は含むがidx2は含まれない
str.substringWithRange(Range(start: idx1, end: idx2)) // => "B"
// idx1もidx2も両方含まれる
str.substringWithRange(idx1...idx2) // => "BC"
// idx1は含むがidx2は含まれない
str.substringWithRange(idx1..<idx2) // => "B"
// str.substringWithRange(idx1..idx2) => コンパイルエラー(半閉空間の指定の演算子は..<)