
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?