No Swift, como posso verificar se existe um elemento em uma matriz? O Xcode não tem sugestões para contain
, include
ou has
, e uma pesquisa rápida no livro não resultou em nada. Alguma idéia de como verificar isso? Eu sei que existe um método find
que retorna o número do índice, mas existe um método que retorna um booleano como o ruby #include?
?
Exemplo do que eu preciso:
var elements = [1,2,3,4,5]
if elements.contains(5) {
//do something
}
if find(elements, 5) != nil { }
não é bom o suficiente?Respostas:
Swift 2, 3, 4, 5:
contains()
é um método de extensão de protocolo deSequenceType
(para seqüências deEquatable
elementos) e não um método global como em versões anteriores.Observações:
contains()
método requer que os elementos de sequência adotem oEquatable
protocolo, compare, por exemplo, a resposta de Andrews .NSObject
subclasse, você precisará substituirisEqual:
, consulte a subclasse NSObject em Swift: hash vs hashValue, isEqual vs == .contains()
método - mais geral - que não exige que os elementos sejam equacionáveis e usa um predicado como argumento; veja, por exemplo, atalho para testar se existe um objeto em uma matriz para o Swift? .Swift versões anteriores:
fonte
Equatable
protocolo (o queDictionary<String, AnyObject>
não acontece). Há uma segunda variante docontains()
que leva um predicado (compare stackoverflow.com/questions/29679486/... ) talvez você pode usar isso, por exemploif contains(array, { $0 == dict } ) ...
Para aqueles que vieram aqui procurando uma localização e remover um objeto de uma matriz:
Swift 1
Swift 2
Swift 3, 4
Swift 5.2
fonte
Use esta extensão:
Use como:
Atualizado para Swift 2/3
Observe que a partir do Swift 3 (ou mesmo 2), a extensão não é mais necessária, pois a
contains
função global foi transformada em um par de método de extensão ativadoArray
, o que permite:fonte
Se você estiver verificando se uma instância de uma classe ou estrutura personalizada está contida em uma matriz, será necessário implementar o protocolo Equatable antes de poder usar .contains (myObject).
Por exemplo:
então você pode fazer:
Dica : a substituição == deve estar no nível global, não dentro da sua classe / estrutura
fonte
Eu usei filtro.
Se você quiser, pode compactar isso para
Espero que ajude.
Atualização para Swift 2
Hurrah para implementações padrão!
fonte
(Swift 3)
Verifique se existe um elemento em uma matriz (atendendo a alguns critérios) e , se houver, continue trabalhando com o primeiro desses elementos.
Se a intenção for:
Em seguida, uma alternativa para
contains(_:)
blueprintedSequence
éfirst(where:)
deSequence
:Neste exemplo, seu uso pode parecer bobo, mas é muito útil se consultar matrizes de tipos de elementos não fundamentais para a existência de quaisquer elementos que atendam a alguma condição. Por exemplo
Quaisquer operações encadeadas usando
.filter { ... some condition }.first
podem ser substituídas favoravelmente porfirst(where:)
. O último mostra melhor a intenção e tem vantagens de desempenho em relação a possíveis dispositivos não preguiçosos.filter
, pois eles passarão por toda a matriz antes de extrair o (possível) primeiro elemento que passa pelo filtro.Verifique se existe um elemento em uma matriz (atendendo a alguns critérios) e , se houver, remova o primeiro desses elementos
Um comentário abaixo consulta:
Um caso de uso semelhante ao descrito acima é remover o primeiro elemento que atende a um determinado predicado. Para fazer isso, o
index(where:)
método deCollection
(que está prontamente disponível para a coleção de matrizes) pode ser usado para encontrar o índice do primeiro elemento que preenche o predicado, depois o índice pode ser usado com oremove(at:)
método deArray
(possível; dado que ele existe) remova esse elemento.Ou, se você deseja remover o elemento da matriz e trabalhar com , aplique
Optional
omap(_:)
método s para usar condicionalmente (para.some(...)
retornar deindex(where:)
) o resultado deindex(where:)
para remover e capturar o elemento removido da matriz (dentro de uma cláusula de ligação opcional) .Observe que, no exemplo inventado acima, os membros da matriz são tipos simples de valores (
String
instâncias), portanto, usar um predicado para encontrar um determinado membro é um exagero , pois podemos simplesmente testar a igualdade usando oindex(of:)
método mais simples , como mostrado na resposta do @ DogCoffee . Se aplicar a abordagem de localização e remoção acima aoPerson
exemplo, no entanto, o usoindex(where:)
com um predicado é apropriado (já que não testamos mais a igualdade, mas o cumprimento de um predicado fornecido).fonte
A maneira mais simples de fazer isso é usar o filtro na matriz.
result
terá o elemento encontrado, se ele existir, e estará vazio se o elemento não existir. Portanto, basta verificar seresult
está vazio para saber se o elemento existe na matriz. Eu usaria o seguinte:fonte
let result = elements.filter { $0==5 }.first
deve realizar o que você está procurando.Swift 4/5
Outra maneira de conseguir isso é com a função de filtro
fonte
A partir do Swift 2.1, os NSArrays
containsObject
podem ser usados da seguinte maneira:fonte
Apenas no caso de alguém tentar descobrir se um
indexPath
está entre os selecionados (como em aUICollectionView
ouUITableView
cellForItemAtIndexPath
funções):fonte
Matriz
Verificar presença de elementos
Obter índice de elementos
Obter contagem de elementos
fonte
Aqui está minha pequena extensão que acabei de escrever para verificar se minha matriz de delegados contém ou não um objeto de delegação ( Swift 2 ). :) Também funciona com tipos de valor como um encanto.
Se você tem uma idéia de como otimizar esse código, informe-me.
fonte
se o usuário encontrar elementos específicos da matriz, use o código abaixo, igual ao valor inteiro.
fonte
Rápido
Se você não estiver usando o objeto, poderá usar este código para contém.
Se você estiver usando a classe NSObject rapidamente. Essas variáveis estão de acordo com minha exigência. você pode modificar para sua exigência.
Isso é para o mesmo tipo de dados.
Se você deseja o tipo AnyObject.
Condição completa
fonte
que tal usar uma tabela de hash para o trabalho, assim?
primeiro, criando uma função genérica "mapa de hash", estendendo o protocolo Sequence.
Essa extensão funcionará desde que os itens da matriz estejam em conformidade com Hashable, como números inteiros ou seqüências de caracteres, aqui está o uso ...
Mas, por enquanto, vamos nos concentrar apenas em verificar se o elemento está na matriz.
fonte
Swift 4.2 +
Você pode facilmente verificar se a sua instância é uma matriz ou não pela seguinte função.
Mesmo você pode acessá-lo da seguinte forma. Você receberá
nil
se o objeto não for uma matriz.fonte