En Swift, ¿hay alguna forma de verificar si existe un índice en una matriz sin que se genere un error fatal?
Esperaba poder hacer algo como esto:
let arr: [String] = ["foo", "bar"]
let str: String? = arr[1]
if let str2 = arr[2] as String? {
// this wouldn't run
println(str2)
} else {
// this would be run
}
Pero consigo
error fatal: índice de matriz fuera de rango
index < array.count
?index >= 0 && index < array.count
lugar de que el peor de los casos sea n comparacionesArraySlice
, el primer índice no será 0, por lo que hacerloindex >= 0
no será una verificación lo suficientemente buena..indices
en cambio funciona en cualquier caso.Tipo de extensión:
Con esto, obtiene un valor opcional cuando agrega la palabra clave opcional a su índice, lo que significa que su programa no se bloquea incluso si el índice está fuera de rango. En tu ejemplo:
fuente
optional
en el parámetro. ¡Gracias!Simplemente verifique si el índice es menor que el tamaño de la matriz:
fuente
Agregue un poco de azúcar de extensión:
Mejora la legibilidad al hacer
if let
codificación de estilo junto con matricesfuente
Puede reescribir esto de una manera más segura para verificar el tamaño de la matriz y usar un condicional ternario:
fuente
if
declaraciones en lugar de unaif
declaración en el código original. Mi código reemplaza el segundoif
con un operador condicional, lo que le permite mantener uno solo enelse
lugar de forzar doselse
bloques separados .if
de OP terminará dentro de la rama "entonces" de la respuesta de Antonio, por lo que habría dosif
s anidados . Estoy viendo el código de OP como un pequeño ejemplo, así que supongo que todavía querría unif
. Estoy de acuerdo con usted en que en su ejemploif
no es necesario. Pero, de nuevo, toda la declaración no tiene sentido, porque OP sabe que la matriz no tiene suficiente longitud, y que ninguno de sus elementos lo esnil
, por lo que podría eliminarif
y mantener solo suelse
bloque.Extensión Swift 4:
Para mí prefiero como método.
Gracias a @Benno Kress
fuente
Afirmando si existe un índice de matriz:
Esta metodología es excelente si no desea agregar azúcar de extensión:
fuente
Es trabajo para mí manejar indexOutOfBounds .
fuente