Усі наведені нижче приклади використовують
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
індекс для Strings. Причиною того, що вам потрібно створити нову String.Index
для кожної струни, є те, що символи у Swift не всі однакової довжини під кришкою. Один символ Swift може складатися з однієї, двох, а то й більше кодових точок Unicode. Таким чином, кожен унікальний рядок повинен обчислювати індекси своїх символів.
Можливо, цю складність приховати за розширенням індексу Int, але я не хочу це робити. Добре нагадати, що насправді відбувається.
startIndex
нічого іншого, ніж 0?