NSArray
et NSMutableArray
fournir des méthodes pour filtrer le contenu du tableau. NSArray
fournit filteredArrayUsingPredicate: qui renvoie un nouveau tableau contenant des objets dans le récepteur qui correspondent au prédicat spécifié. NSMutableArray
ajoute filterUsingPredicate: qui évalue le contenu du récepteur par rapport au prédicat spécifié et ne laisse que les objets qui correspondent. Ces méthodes sont illustrées dans l'exemple suivant.
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" }
Il existe de nombreuses façons de le faire, mais de loin le plus simple est sûrement d'utiliser
[NSPredicate predicateWithBlock:]
:Je pense que c'est à peu près aussi concis que possible.
Rapide:
Pour ceux qui travaillent avec
NSArray
s dans Swift, vous préférerez peut-être cette version encore plus concise:filter
est juste une méthode surArray
(NSArray
est implicitement reliée à celle de SwiftArray
). Il prend un argument: une fermeture qui prend un objet dans le tableau et renvoie unBool
. Dans votre conclusion, revenez simplementtrue
pour tous les objets que vous voulez dans le tableau filtré.la source
NSPredicate predicateWithBlock:
API.bindings
dictionnaire peut contenir des liaisons de variables pour les modèles.Basé sur une réponse de Clay Bridges, voici un exemple de filtrage à l'aide de blocs (changez le nom de votre
yourArray
variable de tableau ettestFunc
le nom de votre fonction de test):la source
filteredArrayUsingPredicate
est plus léger, le fait que vous n'utilisiez aucun prédicat en obscurcit le but.Implicit conversion of 'NSUInteger' (aka 'unsigned long') to 'NSIndexSet * _Nonnull' is disallowed with ARC
... il attend NSIndexSetsindexOfObjectPassingTest
place deindexesOfObjectsPassingTest
. Facile à manquer, mais grosse différence :)Si vous êtes OS X 10.6 / iOS 4.0 ou version ultérieure, vous êtes probablement mieux avec des blocs que NSPredicate. Voir
-[NSArray indexesOfObjectsPassingTest:]
ou écrire votre propre catégorie pour ajouter une pratique-select:
ou une-filter:
méthode ( exemple ).Vous voulez que quelqu'un d'autre écrive cette catégorie, la teste, etc.? Découvrez BlocksKit ( documentation sur le tableau ). Et il y a beaucoup plus d'exemples à trouver, par exemple, en recherchant par exemple "nsarray block category select" .
la source
En supposant que vos objets sont tous d'un type similaire, vous pouvez ajouter une méthode en tant que catégorie de leur classe de base qui appelle la fonction que vous utilisez pour vos critères. Créez ensuite un objet NSPredicate qui fait référence à cette méthode.
Dans certaines catégories, définissez votre méthode qui utilise votre fonction
Ensuite, partout où vous filtrerez:
Bien sûr, si votre fonction se compare uniquement aux propriétés accessibles à partir de votre classe, il peut être plus simple de convertir les conditions de la fonction en une chaîne de prédicat.
la source
NSPredicate
est la façon de construire nextstep état pour filtrer une collection (NSArray
,NSSet
,NSDictionary
).Par exemple, considérons deux tableaux
arr
etfilteredarr
:le filteredarr aura sûrement les éléments qui contiennent le caractère c seul.
pour se souvenir facilement de ceux qui ont peu d'arrière-plan SQL
1) sélectionnez * de tbl -> collection
2) colonne1 comme '% a%' ->
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@",@"c"];
3) sélectionnez * de tbl où column1 comme '% a%' ->
J'espère que ça aide
la source
NSArray + Xh
NSArray + Xm
Vous pouvez télécharger cette catégorie ici
la source
Découvrez cette bibliothèque
https://github.com/BadChoice/Collection
Il est livré avec de nombreuses fonctions de tableau faciles pour ne plus jamais écrire une boucle
Vous pouvez donc simplement faire:
ou
la source
Le meilleur moyen est de créer cette méthode et de transmettre le tableau et la valeur:
la source