NSArray
y NSMutableArray
proporcionar métodos para filtrar el contenido de la matriz. NSArray
proporciona filterArrayUsingPredicate: que devuelve una nueva matriz que contiene objetos en el receptor que coinciden con el predicado especificado. NSMutableArray
agrega filterUsingPredicate: que evalúa el contenido del receptor contra el predicado especificado y deja solo los objetos que coinciden. Estos métodos se ilustran en el siguiente ejemplo.
NSMutableArray *array =
[NSMutableArray arrayWithObjects:@"Bill", @"Ben", @"Chris", @"Melissa", nil];
NSPredicate *bPredicate =
[NSPredicate predicateWithFormat:@"SELF beginswith[c] 'b'"];
NSArray *beginWithB =
[array filteredArrayUsingPredicate:bPredicate];
// beginWithB contains { @"Bill", @"Ben" }.
NSPredicate *sPredicate =
[NSPredicate predicateWithFormat:@"SELF contains[c] 's'"];
[array filteredArrayUsingPredicate:sPredicate];
// array now contains { @"Chris", @"Melissa" }
Hay muchas formas de hacer esto, pero el más seguro es usar
[NSPredicate predicateWithBlock:]
:Creo que es lo más conciso posible.
Rápido:
Para aquellos que trabajan con
NSArray
s en Swift, puede preferir esta versión aún más concisa:filter
es solo un método activadoArray
(NSArray
está implícitamente unido a SwiftArray
). Se necesita un argumento: un cierre que toma un objeto en la matriz y devuelve aBool
. En su cierre, simplemente regresetrue
para cualquier objeto que desee en la matriz filtrada.fuente
NSPredicate predicateWithBlock:
.bindings
diccionario puede contener enlaces variables para plantillas.Basado en una respuesta de Clay Bridges, aquí hay un ejemplo de filtrado usando bloques (cambie el nombre de su
yourArray
variable de matriz ytestFunc
el nombre de su función de prueba):fuente
filteredArrayUsingPredicate
es más delgado, el hecho de que no uses ningún tipo de predicado oscurece el propósito.Implicit conversion of 'NSUInteger' (aka 'unsigned long') to 'NSIndexSet * _Nonnull' is disallowed with ARC
... espera NSIndexSetsindexOfObjectPassingTest
lugar de hacerloindexesOfObjectsPassingTest
. Fácil de perder, pero gran diferencia :)Si tiene OS X 10.6 / iOS 4.0 o posterior, probablemente esté mejor con bloques que NSPredicate. Vea
-[NSArray indexesOfObjectsPassingTest:]
o escriba su propia categoría para agregar un práctico-select:
o-filter:
método ( ejemplo ).¿Quieres que alguien más escriba esa categoría, la pruebe, etc.? Echa un vistazo a BlocksKit ( matriz de documentos ). Y hay muchos más ejemplos que se pueden encontrar, por ejemplo, buscando, por ejemplo, "selección de categoría de bloque nsarray" .
fuente
Suponiendo que todos sus objetos son del mismo tipo, podría agregar un método como categoría de su clase base que llame a la función que está utilizando para sus criterios. Luego cree un objeto NSPredicate que se refiera a ese método.
En alguna categoría, defina su método que usa su función
Luego, donde sea que estés filtrando:
Por supuesto, si su función solo se compara con las propiedades accesibles desde su clase, puede ser más fácil convertir las condiciones de la función en una cadena de predicados.
fuente
NSPredicate
es la forma de nextstep de construir condiciones para filtrar una colección (NSArray
,NSSet
,NSDictionary
).Por ejemplo, considere dos matrices
arr
yfilteredarr
:el filteredarr seguramente tendrá los elementos que contienen el carácter c solo.
para que sea fácil recordar a aquellos que poco fondo de sql es
1) seleccione * de tbl -> colección
2) columna1 como '% a%' ->
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@",@"c"];
3) seleccione * de tbl donde column1 como '% a%' ->
espero que esto ayude
fuente
NSArray + Xh
NSArray + Xm
Puedes descargar esta categoría aquí
fuente
Mira esta biblioteca
https://github.com/BadChoice/Collection
Viene con muchas funciones de matriz fáciles para nunca volver a escribir un bucle
Entonces solo puedes hacer:
o
fuente
La mejor y más fácil manera es crear este método y pasar matriz y valor:
fuente