
Усі наведені нижче приклади використовують
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?