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?é
. Na verdade, é feito dee
mais uma\u{301}
representação Unicode. Se você usasse um índice zero, obteria oe
ou o caractere de acento ("grave"), não o cluster inteiro que compõe oé
. Usar ostartIndex
garante que você obterá todo o agrupamento de grafemas para qualquer personagem.String.Index
partir de um inteiro, diferente de construir uma string fictícia e usar o.index
método nela? Não sei se estou faltando alguma coisa, mas os médicos não dizem nada.String.Index
com um inteiro porque cada SwiftCharacter
não é necessariamente igual à mesma coisa que você quer dizer com um inteiro. Dito isso, você pode passar um número inteiro nooffsetBy
parâmetro para criar umString.Index
.String
Porém, se você não tiver um , não poderá construir umString.Index
(porque o Swift só pode calcular o índice se souber quais são os caracteres anteriores da string). Se você alterar a string, deverá recalcular o índice. Você não pode usar o mesmoString.Index
em duas cordas diferentes.fonte
Crie um UITextView dentro de um tableViewController. Usei function: textViewDidChange e verifiquei a entrada da tecla return. então, se detectou a entrada da tecla de retorno, exclua a entrada da tecla de retorno e descarte o teclado.
fonte