NSArray
i NSMutableArray
zapewniają metody filtrowania zawartości tablicy. NSArray
zapewnia filterArrayUsingPredicate: która zwraca nową tablicę zawierającą obiekty w odbiorniku, które pasują do określonego predykatu. NSMutableArray
dodaje filterUsingPredicate: która ocenia zawartość odbiorcy względem określonego predykatu i pozostawia tylko obiekty, które pasują. Poniższy przykład ilustruje te metody.
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" }
Można to zrobić na wiele sposobów, ale zdecydowanie najlepszym z nich jest użycie
[NSPredicate predicateWithBlock:]
:Myślę, że to jest tak zwięzłe, jak to tylko możliwe.
Szybki:
Osoby pracujące z
NSArray
językami Swift mogą preferować tę jeszcze bardziej zwięzłą wersję:filter
jest tylko metodą włączonąArray
(NSArray
jest niejawnie połączona z językiem SwiftArray
). Przyjmuje jeden argument: zamknięcie, które przyjmuje jeden obiekt w tablicy i zwraca wartośćBool
. W swoim zamknięciu po prostu wróćtrue
dla dowolnych obiektów, które chcesz umieścić w filtrowanej tablicy.źródło
NSPredicate predicateWithBlock:
API.bindings
Słownik może zawierać zmienne powiązania dla szablonów.Na podstawie odpowiedzi udzielonej przez Clay Bridges, oto przykład filtrowania za pomocą bloków (zmień
yourArray
nazwę zmiennej tablicy itestFunc
nazwę funkcji testującej):źródło
filteredArrayUsingPredicate
jest szczuplejsza, fakt, że nie używasz żadnych predykatów, niejako przesłania cel.Implicit conversion of 'NSUInteger' (aka 'unsigned long') to 'NSIndexSet * _Nonnull' is disallowed with ARC
... oczekuje NSIndexSetsindexOfObjectPassingTest
zamiastindexesOfObjectsPassingTest
. Łatwo przeoczyć, ale duża różnica :)Jeśli korzystasz z systemu OS X 10.6 / iOS 4.0 lub nowszego, prawdopodobnie lepiej będzie Ci używać bloków niż NSPredicate. Zobacz
-[NSArray indexesOfObjectsPassingTest:]
lub napisz własną kategorię, aby dodać przydatne rozwiązanie-select:
lub-filter:
metodę ( przykład ).Chcesz, żeby ktoś inny napisał tę kategorię, przetestował ją itp.? Sprawdź BlocksKit ( tablice dokumentów ). I istnieje wiele przykładów można znaleźć więcej za, powiedzmy, szukający np „kategoria NSArray blok wybierz” .
źródło
Zakładając, że wszystkie obiekty są podobnego typu, możesz dodać metodę jako kategorię ich klasy bazowej, która wywołuje funkcję, której używasz dla kryteriów. Następnie utwórz obiekt NSPredicate, który odwołuje się do tej metody.
W jakiejś kategorii zdefiniuj metodę, która używa Twojej funkcji
Następnie, gdziekolwiek będziesz filtrować:
Oczywiście, jeśli twoja funkcja porównuje tylko z właściwościami dostępnymi z poziomu twojej klasy, może być po prostu łatwiej przekonwertować warunki funkcji na łańcuch predykatu.
źródło
NSPredicate
jest sposób konstruowania nextstep za warunek filtru zbiór (NSArray
,NSSet
,NSDictionary
).Na przykład rozważ dwie tablice
arr
ifilteredarr
:filterarr z pewnością będzie zawierał elementy zawierające sam znak c.
aby ułatwić zapamiętanie tych, którzy mają małe tło sql
1) wybierz * z tbl -> kolekcja
2) kolumna1, np. „% A%” ->
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@",@"c"];
3) wybierz * z tabeli, gdzie kolumna1, np. „% A%” ->
mam nadzieję, że to pomoże
źródło
NSArray + Xh
NSArray + Xm
Możesz pobrać tę kategorię tutaj
źródło
Sprawdź tę bibliotekę
https://github.com/BadChoice/Collection
Zawiera wiele łatwych funkcji tablicowych, aby nigdy więcej nie napisać pętli
Możesz więc po prostu:
lub
źródło
Najlepszym i najłatwiejszym sposobem jest utworzenie tej metody i przekazanie tablicy i wartości:
źródło