Help us understand the problem. What is going on with this article?

String.Indexを使った文字列処理

More than 5 years have passed since last update.

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) => コンパイルエラー(半閉空間の指定の演算子は..<)


sansan
法人向け名刺管理サービスSansan及び個人向け名刺管理サービスEightを企画・開発・販売するベンチャー
http://jp.corp-sansan.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした