NSArray
und NSMutableArray
Methoden zum Filtern von Array-Inhalten bereitstellen. NSArray
bietet gefiltertesArrayUsingPredicate: Gibt ein neues Array zurück, das Objekte im Empfänger enthält, die mit dem angegebenen Prädikat übereinstimmen. NSMutableArray
fügt filterUsingPredicate hinzu : Hiermit wird der Inhalt des Empfängers anhand des angegebenen Prädikats bewertet und nur übereinstimmende Objekte belassen . Diese Methoden werden im folgenden Beispiel veranschaulicht.
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" }
Es gibt viele Möglichkeiten, dies zu tun, aber bei weitem die sauberste verwendet sicherlich
[NSPredicate predicateWithBlock:]
:Ich denke, das ist so kurz wie es nur geht.
Schnell:
Für diejenigen, die mit
NSArray
s in Swift arbeiten, bevorzugen Sie möglicherweise diese noch präzisere Version:filter
ist nur eine Methode aufArray
(NSArray
ist implizit mit Swifts verbundenArray
). Es braucht ein Argument: einen Abschluss, der ein Objekt im Array nimmt und a zurückgibtBool
.true
Kehren Sie in Ihrem Abschluss einfach für alle gewünschten Objekte im gefilterten Array zurück.quelle
NSPredicate predicateWithBlock:
API benötigt.bindings
Wörterbuch kann variable Bindungen für Vorlagen enthalten.Basierend auf einer Antwort von Clay Bridges finden Sie hier ein Beispiel für das Filtern mithilfe von Blöcken (ändern
yourArray
SietestFunc
den Namen Ihrer Array-Variablen und den Namen Ihrer Testfunktion):quelle
filteredArrayUsingPredicate
es schlanker ist, verdunkelt die Tatsache, dass Sie keine Prädikate verwenden, den Zweck.Implicit conversion of 'NSUInteger' (aka 'unsigned long') to 'NSIndexSet * _Nonnull' is disallowed with ARC
... es werden NSIndexSets erwartetindexOfObjectPassingTest
anstelle von verwendet habenindexesOfObjectsPassingTest
. Leicht zu übersehen, aber großer Unterschied :)Wenn Sie OS X 10.6 / iOS 4.0 oder höher sind, sind Sie mit Blöcken wahrscheinlich besser dran als mit NSPredicate. Sehen
-[NSArray indexesOfObjectsPassingTest:]
oder schreiben Sie Ihre eigene Kategorie, um ein Handy-select:
oder eine-filter:
Methode hinzuzufügen ( Beispiel ).Möchten Sie, dass jemand anderes diese Kategorie schreibt, testet usw.? Schauen Sie sich BlocksKit ( Array-Dokumente ) an. Und es gibt noch viele weitere Beispiele, die beispielsweise durch die Suche nach "nsarray block category select" gefunden werden können .
quelle
Angenommen, Ihre Objekte haben alle einen ähnlichen Typ, können Sie eine Methode als Kategorie ihrer Basisklasse hinzufügen, die die Funktion aufruft, die Sie für Ihre Kriterien verwenden. Erstellen Sie dann ein NSPredicate-Objekt, das auf diese Methode verweist.
Definieren Sie in einigen Kategorien Ihre Methode, die Ihre Funktion verwendet
Dann, wo immer Sie filtern:
Wenn Ihre Funktion nur mit Eigenschaften verglichen wird, die innerhalb Ihrer Klasse erreichbar sind, ist es natürlich möglicherweise einfacher, die Bedingungen der Funktion in eine Prädikatzeichenfolge zu konvertieren.
quelle
NSPredicate
ist der Weg der Nextstep Bedingung Filter eine Sammlung von Konstruieren (NSArray
,NSSet
,NSDictionary
).Betrachten Sie zum Beispiel zwei Arrays
arr
undfilteredarr
:Der Filteredarr wird sicherlich nur die Elemente haben, die das Zeichen c enthalten.
um es einfach zu machen, sich an diejenigen zu erinnern, die wenig SQL-Hintergrund haben
1) Wählen Sie * aus tbl -> Sammlung
2) Spalte1 wie '% a%' ->
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@",@"c"];
3) Wählen Sie * aus tbl, wobei Spalte1 '% a%' -> ist
ich hoffe das hilft
quelle
NSArray + Xh
NSArray + Xm
Sie können diese Kategorie hier herunterladen
quelle
Kasse dieser Bibliothek
https://github.com/BadChoice/Collection
Es kommt mit vielen einfachen Array-Funktionen, um nie wieder eine Schleife zu schreiben
Sie können also einfach Folgendes tun:
oder
quelle
Der beste und einfachste Weg ist, diese Methode zu erstellen und Array und Wert zu übergeben:
quelle