NSIndexSet
Index
(igual que su contraparte mutable, NSMutableIndexSet) es una colección ordenada de enteros únicos sin signo (UInt
). Piensa en ella como un Range
que soporta series no-contiguas. Sus operaciones para encontrar índices en rangos o realizar la intersecciones entre sets son tremendamente rápidas, e implementa todos los métodos de conveniencia que cabría esperar de una clase Foundation.
Index
se usa ampliamente en el propio Foundation framework. Cada vez que un método obtiene elementos de una colección ordenada, como en el caso de un array o del data source de una tableView, se usará Index
en algún punto intermedio.
Es muy probable que encuentres ciertos aspectos de tu modelo que podrían representarse también con Index
. Por ejemplo, AFNetworking usa un Index
para representar los códigos de estado de una respuesta HTTP: el usuario define un set de códigos “aceptables” (en el rango 2XX, por defecto), y la respuesta se comprueba usando contains
.
Un ejemplo sencillo del uso de index sets y rangos que puedes copiar y pegar en un Swift Playground:
import Foundation
let streetscape = ["Ashmead", "Belmont", "Clifton", "Douglas", "Euclid", "Fairmont",
"Girard", "Harvard", "Irving", "Kenyon", "Lamont", "Monroe",
"Newton", "Otis", "Perry", "Quincy"]
let selected Indices = NSMutable Index Set(indexes In: NSRange(0...2))
selected Indices.add(5)
selected Indices.add(in: NSRange(11...13))
selected Indices.map { print(streetscape[$0]) }
// Ashmead, Belmont, Clifton, Fairmont, Monroe, Newton, Otis
Algunas ideas para hacerte pensar en términos de index sets:
- ¿Tienes una lista de preferencias de usuario y quieres guardar cúales están activadas y cuáles no? Usa un
NSIndex
en combinación con unSet enum
typedef
. - ¿Quieres filtrar una lista de elementos por una serie de condiciones? Descarta
NSPredicate
; en su lugar cachea los índices de los objetos que satisfacen cada condición y haz la unión o intersección de esos índices a medida que se añaden o eliminan condiciones.
En general, Index
es una clase robusta. Quizá un poco más nerd que sus colecciones hermanas, pero tiene su lugar y, como mínimo, es un gran indicativo de la fantástica funcionalidad que puedes encontrar al poner un poco de atención en lo que Foundation usa en sus propias APIs.