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?