Todos os exemplos a seguir usam
var str = "Hello, playground"
startIndex
e endIndex
startIndex
é o índice do primeiro personagem
endIndex
é o índice após o último caractere.
Exemplo
// character
str[str.startIndex] // H
str[str.endIndex] // error: after last character
// range
let range = str.startIndex..<str.endIndex
str[range] // "Hello, playground"
Com os intervalos unilaterais do Swift 4 , o intervalo pode ser simplificado para uma das seguintes formas.
let range = str.startIndex...
let range = ..<str.endIndex
Usarei a forma completa nos exemplos a seguir por uma questão de clareza, mas por uma questão de legibilidade, você provavelmente desejará usar os intervalos unilaterais em seu código.
after
Como em: index(after: String.Index)
after
refere-se ao índice do personagem diretamente após o índice fornecido.
Exemplos
// 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
Como em: index(before: String.Index)
before
refere-se ao índice do personagem diretamente antes do índice fornecido.
Exemplos
// 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
Como em: index(String.Index, offsetBy: String.IndexDistance)
- O
offsetBy
valor pode ser positivo ou negativo e começa a partir do índice fornecido. Embora seja do tipo String.IndexDistance
, você pode atribuir um Int
.
Exemplos
// 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
Como em: index(String.Index, offsetBy: String.IndexDistance, limitedBy: String.Index)
- O
limitedBy
é útil para garantir que o deslocamento não faça com que o índice saia dos limites. É um índice limitante. Como é possível que o deslocamento exceda o limite, este método retorna um opcional. Ele retorna nil
se o índice está fora dos limites.
Exemplo
// character
if let index = str.index(str.startIndex, offsetBy: 7, limitedBy: str.endIndex) {
str[index] // p
}
Se o deslocamento tivesse sido em 77
vez de 7
, a if
instrução teria sido ignorada.
Por que String.Index é necessário?
Seria muito mais fácil usar um Int
índice para Strings. O motivo pelo qual você deve criar um novo String.Index
para cada String é que os caracteres em Swift não têm todos o mesmo comprimento sob o capô. Um único caractere Swift pode ser composto de um, dois ou até mais pontos de código Unicode. Assim, cada String única deve calcular os índices de seus Personagens.
É possível ocultar essa complexidade por trás de uma extensão de índice Int, mas estou relutante em fazer isso. É bom ser lembrado do que está realmente acontecendo.
startIndex
seria qualquer outra coisa senão 0?