NSArray
e NSMutableArray
forneça métodos para filtrar o conteúdo da matriz. NSArray
fornece o método filterArrayUsingPredicate: que retorna uma nova matriz que contém objetos no receptor que correspondem ao predicado especificado. NSMutableArray
adiciona filterUsingPredicate: que avalia o conteúdo do destinatário em relação ao predicado especificado e deixa apenas os objetos correspondentes. Esses métodos são ilustrados no exemplo a seguir.
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" }
Existem várias maneiras de fazer isso, mas, de longe, o mais puro é certamente usar
[NSPredicate predicateWithBlock:]
:Eu acho que é o mais conciso possível.
Rápido:
Para quem trabalha com
NSArray
s no Swift, você pode preferir esta versão ainda mais concisa:filter
é apenas um método ativadoArray
(NSArray
é implicitamente vinculado ao de SwiftArray
). É preciso um argumento: um fechamento que pega um objeto na matriz e retorna aBool
. No seu encerramento, basta retornartrue
para os objetos que você deseja na matriz filtrada.fonte
NSPredicate predicateWithBlock:
API.bindings
dicionário pode conter ligações variáveis para modelos.Com base em uma resposta de Clay Bridges, aqui está um exemplo de filtragem usando blocos (mude
yourArray
para o nome da variável da matriz etestFunc
para o nome da sua função de teste):fonte
filteredArrayUsingPredicate
mais enxuto, o fato de você não usar nenhum predicado obscurece o objetivo.Implicit conversion of 'NSUInteger' (aka 'unsigned long') to 'NSIndexSet * _Nonnull' is disallowed with ARC
... ele espera NSIndexSetsindexOfObjectPassingTest
vez deindexesOfObjectsPassingTest
. Fácil de perder, mas grande diferença :)Se você possui o OS X 10.6 / iOS 4.0 ou posterior, provavelmente está melhor com blocos do que o NSPredicate. Veja
-[NSArray indexesOfObjectsPassingTest:]
ou escreva sua própria categoria para adicionar um método-select:
ou-filter:
método útil ( exemplo ).Quer que outra pessoa escreva essa categoria, teste-a etc.? Confira o BlocksKit ( documentos da matriz ). E há muitos outros exemplos a serem encontrados, digamos, pesquisando, por exemplo, "nsarray block category select" .
fonte
Supondo que seus objetos sejam todos de um tipo semelhante, você pode adicionar um método como uma categoria de sua classe base que chama a função que você está usando para seus critérios. Em seguida, crie um objeto NSPredicate que se refere a esse método.
Em alguma categoria, defina seu método que usa sua função
Então, onde quer que você esteja filtrando:
Obviamente, se sua função for comparada apenas às propriedades alcançáveis de sua classe, pode ser mais fácil converter as condições da função em uma sequência de predicados.
fonte
NSPredicate
é o caminho de nextstep de construir condições para filtrar uma coleção (NSArray
,NSSet
,NSDictionary
).Por exemplo, considere duas matrizes
arr
efilteredarr
:a área filtrada certamente terá os itens que contêm o caractere c sozinho.
para facilitar a lembrança daqueles que têm pouco background sql
1) selecione * de tbl -> coleção
2) coluna1 como '% a%' ->
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@",@"c"];
3) selecione * de tbl onde coluna1 como '% a%' ->
Eu espero que isso ajude
fonte
NSArray + Xh
NSArray + Xm
Você pode baixar esta categoria aqui
fonte
Fazer check-out desta biblioteca
https://github.com/BadChoice/Collection
Ele vem com muitas funções fáceis de array para nunca escrever um loop novamente
Então você pode fazer:
ou
fonte
A maneira melhor e mais fácil é criar esse método And Pass Array And Value:
fonte