Frage

Ich habe ein Array von Wörterbüchern.

Ich mag das Array filtern, basierend auf einem Schlüssel.

Ich habe versucht, dies:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SPORT ==  %@)", @"Football"];

NSArray *filteredArray = [data filteredArrayUsingPredicate:predicate];

Das funktioniert nicht, erhalte ich keine Ergebnisse. Ich glaube, ich bin etwas falsch zu machen. Ich weiß, das die Methode ist, wenn „SPORT“ ein Ivar ist. Ich denke, es ist wahrscheinlich anders ist, wenn es ein Schlüssel ist.

Ich habe nicht in der Lage gewesen, aber ein Beispiel zu finden.

Danke


Aktualisieren

Ich habe Anführungszeichen um die Zeichenfolge ich suche.

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SPORT ==  '%@')", @"Football"];

Es funktioniert immer noch nicht.


Update 2

es wird gelöst. Ich hatte eigentlich die einfachen Anführungszeichen zu entfernen, die gegen zu gehen scheint, was der Guide sagt.

Mein eigentliches Problem ist, hatte ich eine verschachtelte Array und ich war nicht wirklich die Wörterbücher zu bewerten. Knochen Kopf bewegen.

War es hilfreich?

Lösung

Es sollte funktionieren - solange die Datenvariablen ein Wörterbuch mit dem Schlüssel SPORT tatsächlich ein Array mit

NSArray *data = [NSArray arrayWithObject:[NSMutableDictionary dictionaryWithObject:@"foo" forKey:@"BAR"]];    
NSArray *filtered = [data filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(BAR == %@)", @"foo"]];

Gefiltert in diesem Fall enthält das Wörterbuch.

(das% @ muss nicht angegeben werden, erfolgt dies, wenn NSPredicate das Objekt erstellt.)

Andere Tipps

Ich weiß, es ist alte Nachrichten, aber meine zwei Cent hinzuzufügen. Standardmäßig verwende ich die Befehle LIKE[cd] anstatt nur [c]. Die [d] vergleicht Buchstaben mit Akzent Symbolen. Das funktioniert besonders gut in meinem Warcraft App, wo die Menschen ihre Namen „Voodoo-“ Zauber macht es fast unmöglich, ihren Namen in einem Tableview zu suchen. Die [d] Streifen ihren Akzent Symbole während des Prädikats. So ein Prädikat von @"name LIKE[CD] %@", object.name wo object.name == @"voodoo" das Objekt zurück, den Namen voodoo enthält.

Von der Apple-Dokumentation: wie [cd] bedeutet „Fall- und diakritische unempfindliche wie.“) Für eine vollständige Beschreibung der String-Syntax und eine Liste aller verfügbaren Operatoren finden Sie unter Predicate Format String Syntax .

#import <Foundation/Foundation.h>
// clang -framework Foundation Siegfried.m 
    int
main() {
    NSArray *arr = @[
        @{@"1" : @"Fafner"},
        @{@"1" : @"Fasolt"}
    ];
    NSPredicate *p = [NSPredicate predicateWithFormat:
        @"SELF['1'] CONTAINS 'e'"];
    NSArray *res = [arr filteredArrayUsingPredicate:p];
    NSLog(@"Siegfried %@", res);
    return 0;
}

NSPredicate ist nur in iPhone 3.0 verfügbar.

Sie werden das nicht bemerken, bis versuchen, auf dem Gerät ausgeführt werden.

Mit Swift 3, wenn Sie eine Reihe von Wörterbüchern mit einem Prädikat gefiltert werden soll, basierend auf Dictionary-Schlüssel und Werte, können Sie eines der folgenden Muster wählen können.


# 1. Mit NSPredicate init(format:arguments:) initializer

Wenn Sie aus Objective-C, init(format:arguments:) bietet einen Schlüssel-Wert-Codierungsstil Ihr Prädikat zu bewerten.

Verbrauch:

import Foundation

let array = [["key1": "value1", "key2": "value2"], ["key1": "value3"], ["key3": "value4"]]

let predicate = NSPredicate(format: "key1 == %@", "value1")
//let predicate = NSPredicate(format: "self['key1'] == %@", "value1") // also works
let filteredArray = array.filter(predicate.evaluate)

print(filteredArray) // prints: [["key2": "value2", "key1": "value1"]]

# 2. Mit NSPredicate init(block:) initializer

Als Alternative, wenn Sie es vorziehen, stark typisierte APIs über stringly getippt APIs können Sie init(block:) initializer verwenden.

Verbrauch:

import Foundation

let array = [["key1": "value1", "key2": "value2"], ["key1": "value3"], ["key3": "value4"]]

let dictPredicate = NSPredicate(block: { (obj, _) in
    guard let dict = obj as? [String: String], let value = dict["key1"] else { return false }
    return value == "value1"
})

let filteredArray = array.filter(dictPredicate.evaluate)
print(filteredArray) // prints: [["key2": "value2", "key1": "value1"]]

Mit Blick auf die

scroll top