次の例はすべて
var str = "Hello, playground"
startIndex
そして endIndex
startIndex
最初の文字のインデックスです
endIndex
最後の文字の後のインデックスです。
例
// character
str[str.startIndex] // H
str[str.endIndex] // error: after last character
// range
let range = str.startIndex..<str.endIndex
str[range] // "Hello, playground"
Swift 4の片側範囲を使用すると、範囲を次のいずれかの形式に簡略化できます。
let range = str.startIndex...
let range = ..<str.endIndex
以下の例では、わかりやすくするために完全な形式を使用しますが、読みやすくするために、片側の範囲をコードで使用することをお勧めします。
after
のように: index(after: String.Index)
after
指定されたインデックスの直後の文字のインデックスを参照します。
例
// character
let index = str.index(after: str.startIndex)
str[index] // "e"
// range
let range = str.index(after: str.startIndex)..<str.endIndex
str[range] // "ello, playground"
before
のように: index(before: String.Index)
before
指定されたインデックスの直前の文字のインデックスを参照します。
例
// character
let index = str.index(before: str.endIndex)
str[index] // d
// range
let range = str.startIndex..<str.index(before: str.endIndex)
str[range] // Hello, playgroun
offsetBy
のように: index(String.Index, offsetBy: String.IndexDistance)
offsetBy
値は、指定されたインデックスから正または負で開始することができます。それはタイプString.IndexDistance
ですが、あなたはそれにそれを与えることができますInt
。
例
// character
let index = str.index(str.startIndex, offsetBy: 7)
str[index] // p
// range
let start = str.index(str.startIndex, offsetBy: 7)
let end = str.index(str.endIndex, offsetBy: -6)
let range = start..<end
str[range] // play
limitedBy
のように: index(String.Index, offsetBy: String.IndexDistance, limitedBy: String.Index)
limitedBy
必ずオフセットインデックスが境界の外出させないことを製造するのに有用です。これは境界インデックスです。オフセットが制限を超える可能性があるため、このメソッドはオプションを返します。nil
インデックスが範囲外の場合に返されます。
例
// character
if let index = str.index(str.startIndex, offsetBy: 7, limitedBy: str.endIndex) {
str[index] // p
}
オフセットがあった場合は77
代わりに7
、そのif
文はスキップされていたであろう。
なぜString.Indexが必要なのですか?
文字列のインデックスを使用する方がはるかに簡単Int
です。String.Index
すべての文字列に対して新しい文字列を作成する必要があるのは、Swiftの文字の長さがすべて同じではないためです。単一のSwift文字は、1つ、2つ、またはそれ以上のUnicodeコードポイントで構成される場合があります。したがって、各一意の文字列は、その文字のインデックスを計算する必要があります。
この複雑さをIntインデックス拡張の背後に隠すことはおそらく可能ですが、私はそうすることに消極的です。実際に何が起こっているのかを思い出させるのは良いことです。
startIndex
0以外になるのですか?