
Todos los siguientes ejemplos usan
var str = "Hello, playground"
startIndex y endIndex
startIndex es el índice del primer carácter
endIndexes 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
offsetByvalor 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
limitedByes ú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 nilsi 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 77lugar de 7, entonces la ifdeclaració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.Indexpara 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.
startIndexalgo más que 0?é. En realidad, está hecho deemás una\u{301}representación Unicode. Si usara un índice de cero, obtendríaeel carácter de acento o ("grave"), no todo el grupo que forma elé. El uso destartIndexasegura que obtendrá todo el grupo de grafemas para cualquier personaje.String.Indexpartir de un número entero, además de construir una cadena ficticia y usar el.indexmétodo en ella? No sé si me estoy perdiendo algo, pero los médicos no dicen nada.String.Indexcon un número entero porque cada SwiftCharacterno necesariamente equivale a lo mismo que quieres decir con un número entero. Dicho esto, puede pasar un número entero aloffsetBypará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.Indexen 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