Todos los siguientes ejemplos usan
var str = "Hello, playground"
startIndex
y endIndex
startIndex
es el índice del primer carácter
endIndex
es el índice después del último carácter.
Ejemplo
// character
str[str.startIndex] // H
str[str.endIndex] // error: after last character
// range
let range = str.startIndex..<str.endIndex
str[range] // "Hello, playground"
Con los rangos unilaterales de Swift 4 , el rango se puede simplificar a una de las siguientes formas.
let range = str.startIndex...
let range = ..<str.endIndex
Usaré el formulario completo en los siguientes ejemplos en aras de la claridad, pero en aras de la legibilidad, probablemente querrá usar los rangos unilaterales en su código.
after
Como en: index(after: String.Index)
after
se refiere al índice del carácter directamente después del índice dado.
Ejemplos
// 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 en: index(before: String.Index)
before
se refiere al índice del carácter directamente antes del índice dado.
Ejemplos
// 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 en: index(String.Index, offsetBy: String.IndexDistance)
- El
offsetBy
valor puede ser positivo o negativo y comienza desde el índice dado. Aunque es del tipo String.IndexDistance
, puedes darle un Int
.
Ejemplos
// 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 en: index(String.Index, offsetBy: String.IndexDistance, limitedBy: String.Index)
- El
limitedBy
es útil para asegurarse de que el desplazamiento no hace que el índice para ir fuera de límites. Es un índice delimitador. Dado que es posible que el desplazamiento exceda el límite, este método devuelve un Opcional. Vuelve nil
si el índice está fuera de los límites.
Ejemplo
// character
if let index = str.index(str.startIndex, offsetBy: 7, limitedBy: str.endIndex) {
str[index] // p
}
Si el desplazamiento hubiera sido en 77
lugar de 7
, entonces la if
declaración se habría omitido.
¿Por qué se necesita String.Index?
Sería mucho más fácil usar un Int
índice para Strings. La razón por la que tienes que crear una nueva String.Index
para cada cadena es que los personajes en Swift no tienen la misma longitud debajo del capó. Un solo carácter Swift puede estar compuesto por uno, dos o incluso más puntos de código Unicode. Por tanto, cada Cadena única debe calcular los índices de sus Caracteres.
Posiblemente sea para ocultar esta complejidad detrás de una extensión de índice Int, pero soy reacio a hacerlo. Es bueno recordar lo que realmente está sucediendo.
startIndex
algo más que 0?é
. En realidad, está hecho dee
más una\u{301}
representación Unicode. Si usara un índice de cero, obtendríae
el carácter de acento o ("grave"), no todo el grupo que forma elé
. El uso destartIndex
asegura que obtendrá todo el grupo de grafemas para cualquier personaje.String.Index
partir de un número entero, además de construir una cadena ficticia y usar el.index
método en ella? No sé si me estoy perdiendo algo, pero los médicos no dicen nada.String.Index
con un número entero porque cada SwiftCharacter
no necesariamente equivale a lo mismo que quieres decir con un número entero. Dicho esto, puede pasar un número entero aloffsetBy
parámetro para crear unString.Index
. Sin embargo, si no tiene unString
, no puede construir unString.Index
(porque Swift solo puede calcular el índice si sabe cuáles son los caracteres anteriores en la cadena). Si cambia la cadena, debe volver a calcular el índice. No puede usar lo mismoString.Index
en dos cadenas diferentes.fuente
Cree un UITextView dentro de un tableViewController. Usé la función: textViewDidChange y luego verifiqué return-key-input. luego, si detectó return-key-input, borre la entrada de la tecla return y descarte el teclado.
fuente