文字列のメソッドやプロパティ、あるいはサブスクリプトシンタックスを利用して、文字列にアクセス、または文字列を変更します。

文字列インデックス

各 String 値には、文字列内での各 Character の位置に対応するインデックス型 String.Index を持ちます。

先述のように、文字によって異なるメモリ量が必要で、どの Character がどの位置にあるかを特定するために、String の最初から最後までの各 Unicode スカラを繰り返し処理する必要があります。そのため、Swift の文字列は整数値でインデックスすることができません。

String の最初の Character の位置にアクセスするために、startIndex プロパティを利用します。endIndex プロパティの位置は、String の最終文字の後になります。結果として、endIndex プロパティは文字列のサブスクリプト引数として有効ではありません。String が空の場合、startIndex と endIndex は等しくなります。

String.Index 値は、predecessor() メソッドで直前のインデックスに、successor() メソッドで直後のインデックスにアクセスすることができます。String のどのインデックスにも、これらのメソッドをつなげるか、advancedBy(_:) メソッドによって他のインデックスにアクセスすることができます。文字列の範囲外にあるインデックスにアクセスすると、実行時エラーが発生することになります。

String の特定のインデックスにある Character にアクセスするために、サブスクリプトシンタックスを使うことができます。

let greeting = "Guten Tag!"
greeting[greeting.startIndex]
// G
greeting[greeting.endIndex.predecessor()]
// !
greeting[greeting.startIndex.successor()]
// u
let index = greeting.startIndex.advancedBy(7)
greeting[index]
// a

文字列の範囲外のインデックスにある Character にアクセスすると、実行時エラーが発生します。

greeting[greeting.endIndex] // error
greeting.endIndex.successor() // error

文字列内の個々の文字にアクセスするための全インデックスを持つ Range を生成するには、characters プロパティの indices プロパティを利用します。

for index in greeting.characters.indices {
    print("\(greeting[index]) ", terminator: "")
}
// "G u t e n   T a g ! " と出力

挿入と削除

指定したインデックスに文字を挿入するには、insert(_:atIndex:) メソッドを利用します。

var welcome = "hello"
welcome.insert("!", atIndex: welcome.endIndex)
// welcome は "hello!"

指定したインデックスにコンテンツを挿入するには、insertContentsOf(_:at:) メソッドを利用します。

welcome.insertContentsOf(" there".characters, at: welcome.endIndex.predecessor())
// welcome は "hello there!"

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

welcome.removeAtIndex(welcome.endIndex.predecessor())
// welcome は "hello there"

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

let range = welcome.endIndex.advancedBy(-6)..<welcome.endIndex
welcome.removeRange(range)
// welcome は "hello"

Portions of this page are translations based on work created and shared by Apple and used according to terms described in the Creative Commons Attribution 4.0 International License.