À l'aide de NSPredicate pour filtrer un NSArray basé sur NSDictionary clés
J'ai un tableau de dictionnaires.
Je veux filtrer le tableau basé sur une touche.
J'ai essayé ceci:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SPORT == %@)", @"Football"];
NSArray *filteredArray = [data filteredArrayUsingPredicate:predicate];
Cela ne fonctionne pas, je n'obtiens aucun résultat. Je pense que je suis en train de faire quelque chose de mal. Je sais que c'est la méthode si "SPORT" est un ivar. Je pense que c'est probablement différente si c'est une clé.
Je n'ai pas été en mesure de trouver un exemple cependant.
Grâce
Mise à jour
J'ai ajouté des guillemets autour de la chaîne, je suis à la recherche d'.
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SPORT == '%@')", @"Football"];
Il ne fonctionne toujours pas.
Mise à jour 2
Résolu. J'ai effectivement eu à supprimer les guillemets simples, ce qui semble aller à l'encontre de ce que dit le guide.
Mon vrai problème, c'est que j'avais un tableau imbriqué et je n'étais pas vraiment évaluer les dictionnaires. Les os de la tête se déplacer.
- Juste pour mentionner que le prédicat est sensible à la casse par défaut (utilisez le bouton [c] pour obtenir unsensitive).
- double possible de ios tri gamme de dictionnaires en clé de l'intérieur dictionnaire
Vous devez vous connecter pour publier un commentaire.
Il devrait fonctionner qu'à la condition que les données de la variable est en fait un tableau contenant un dictionnaire avec la clé de SPORT
Filtrée dans ce cas, contient le dictionnaire.
(le %@ n'a pas à être cité, ce qui est fait lors de la NSPredicate crée l'objet.)
Je sais que c'est de vieilles nouvelles, mais pour ajouter mon grain de sel. Par défaut j'utilise les commandes
LIKE[cd]
plutôt que de simplement[c]
. Le[d]
compare les lettres avec des accents de symboles. Cela fonctionne particulièrement bien dans mon Warcraft Application où les gens l'orthographe de leur nom "Vòódòó" ce qui rend presque impossible la recherche de leur nom dans un tableview. Le[d]
bandes de leur accent symboles sur le prédicat. Si un prédicat de@"name LIKE[CD] %@", object.name
oùobject.name == @"voodoo"
sera de retour l'objet contenant le nom Vòódòó.À partir de la documentation d'Apple:
comme[cd] signifie “cas - et diacritiques insensible comme.”) Pour une description complète de la syntaxe de la chaîne et une liste de tous les opérateurs disponibles, voir Prédicat Chaîne de Format de Syntaxe.
NSPredicate
est uniquement disponible dans l'iPhone 3.0.Vous ne remarquerez pas que, jusqu'à essayer de l'exécuter sur l'appareil.
Avec Swift 3, lorsque vous souhaitez filtrer un tableau de dictionnaires avec un prédicat de base sur le dictionnaire des clés et des valeurs, vous pouvez choisir l'un des modèles suivants.
#1. À l'aide de
NSPredicate
init(format:arguments:)
initialiseurSi vous venez de l'Objective-C,
init(format:arguments:)
offre une valeur-clé style de codage pour évaluer votre prédicat.Utilisation:
#2. À l'aide de
NSPredicate
init(bloc:)
initialiseurComme une alternative si vous préférez fortement typé Api sur stringly tapé Api, vous pouvez utiliser
init(block:)
initialiseur.Utilisation:
À la recherche à la NSPredicate de référence, il semble que vous devez entourer votre substitution de caractères avec des guillemets. Par exemple, votre prédicat lit:
(SPORT == Football)
Vous souhaitez lire(SPORT == 'Football')
, de sorte que votre chaîne de format doit être@"(SPORT == '%@')"
.