Como posso desmarcar / remover um elemento de uma matriz no novo idioma Swift da Apple?
Aqui está um código:
let animals = ["cats", "dogs", "chimps", "moose"]
Como o elemento pode animals[2]
ser removido da matriz?
A let
palavra-chave é para declarar constantes que não podem ser alteradas. Se você deseja modificar uma variável, você deve usar var
, por exemplo:
var animals = ["cats", "dogs", "chimps", "moose"]
animals.remove(at: 2) //["cats", "dogs", "moose"]
Uma alternativa não mutante que manterá a coleção original inalterada é usar filter
para criar uma nova coleção sem os elementos que você deseja remover, por exemplo:
let pets = animals.filter { $0 != "chimps" }
remove
retorna o elemento removido:let animal = animals.remove(at: 2)
Dado
Remova o primeiro elemento
Remover último elemento
Remover elemento no índice
Remover elemento de índice desconhecido
Para apenas um elemento
Para vários elementos
Notas
filter
) e retornam o elemento que foi removido.dropFirst
oudropLast
criar uma nova matriz.Atualizado para o Swift 5.2
fonte
chimps && moose
por exemplo? Estou procurando algo diferente do que:{$0 != "chimps" && $0 != "moose"}
As respostas acima parecem presumir que você conhece o índice do elemento que deseja excluir.
Muitas vezes, você conhece a referência ao objeto que deseja excluir na matriz. (Você iterou na sua matriz e a encontrou, por exemplo). Nesses casos, pode ser mais fácil trabalhar diretamente com a referência do objeto sem precisar passar em todo lugar seu índice. Por isso, sugiro esta solução. Ele usa o operador de identidade
!==
, usado para testar se duas referências a objetos se referem à mesma instância de objeto.Claro que isso não funciona apenas para
String
s.fonte
list = list.filter({ $0 != element })
array.indexOf({ $0 == obj })
list
essa exclusão não atualizarão as outras referências de matriz, pois você está atribuindo uma nova matrizlist
. Apenas uma implicação sutil se você excluir de matrizes com essa abordagem.Swift 5: Aqui está uma extensão fácil e legal para remover elementos em uma matriz, sem filtrar:
Uso:
Também funciona com outros tipos, como
Int
sinceElement
é um tipo genérico:fonte
Para Swift4:
fonte
A partir do Xcode 10+, e de acordo com a sessão 223 da WWDC 2018, "Abraçando algoritmos", um bom método daqui para frente será
mutating func removeAll(where predicate: (Element) throws -> Bool) rethrows
Exemplo da Apple:
consulte a documentação da Apple
Assim, no exemplo do OP, removendo animais [2], "chimps":
Esse método pode ser preferido porque ele escala bem (linear versus quadrático), é legível e limpo. Lembre-se de que ele só funciona no Xcode 10+ e, por escrito, isso está na versão beta.
fonte
Poucas operações estão relacionadas à matriz no Swift
Criar matriz
Adicionar objeto na matriz
Obter valor do objeto Index
Anexar Objeto
Inserir objeto no índice
Remover Objeto
Valor do objeto Concat
fonte
Você poderia fazer isso. Primeiro verifique se
Dog
realmente existe na matriz e remova-a. Adicione afor
declaração se você acredita que issoDog
pode acontecer mais de uma vez na sua matriz.Se você tem certeza de que as
Dog
saídas na matriz ocorreram apenas uma vez, faça isso:Se você tiver ambos, strings e números
fonte
Se você não conhece o índice do elemento que deseja remover e o elemento está em conformidade com o protocolo Equatable, é possível:
animals.removeAtIndex(animals.indexOf("dogs")!)
Consulte Resposta do protocolo equivalente: Como faço para indexOfObject ou um containsObject adequado
fonte
Remova os elementos usando a matriz de índices:
Matriz de strings e índices
Matriz de números inteiros e índices
Remover elementos usando o valor do elemento de outra matriz
Matrizes de números inteiros
Matrizes de strings
fonte
Em relação à alternativa de @ Suragch para "Remover elemento de índice desconhecido":
Existe uma versão mais poderosa do "indexOf (elemento)" que corresponderá a um predicado em vez do próprio objeto. Ele tem o mesmo nome, mas é chamado por myObjects.indexOf {$ 0.property = valueToMatch}. Retorna o índice do primeiro item correspondente encontrado na matriz myObjects.
Se o elemento for um objeto / estrutura, convém remover esse elemento com base no valor de uma de suas propriedades. Por exemplo, você tem uma classe Car com a propriedade car.color e deseja remover o carro "vermelho" do carsArray.
Previsivelmente, você poderia refazer isso para remover "todos" os carros vermelhos incorporando a instrução if acima em um loop de repetição / while e anexando um bloco else para definir uma bandeira para "sair" do loop.
fonte
Swift 5
fonte
Se você tiver uma matriz de objetos personalizados, poderá pesquisar por propriedade específica como esta:
ou se você deseja pesquisar por nome, por exemplo
fonte
Isso deve ser feito (não testado):
Edit: e você precisa torná-lo um
var
, não umlet
, caso contrário, é uma constante imutável.fonte
Eu vim com a seguinte extensão que cuida da remoção de elementos de um
Array
, assumindo os elementos noArray
implementoEquatable
:Uso:
fonte
extensão para remover o objeto String
fonte
Eu uso essa extensão, quase a mesma da Varun, mas essa (abaixo) é para todos os fins:
fonte
Para remover elementos de uma matriz, use o
remove(at:)
,removeLast()
eremoveAll()
.Remova o valor na posição 2
Remova o último valor da matriz
Remove todos os membros do conjunto
fonte