Existe uma função que eu possa usar para iterar sobre uma matriz e ter índice e elemento, como o enumerado do Python?
for index, element in enumerate(list):
...
arrays
swift
enumeration
thinker3
fonte
fonte
enumerate
?enumerating
para Swift 4. Emocionante!for (index, element) in
ao usarenumerated
é enganoso. deveria serfor (offset, element) in
Swift 5 fornece um método chamado
enumerated()
paraArray
.enumerated()
tem a seguinte declaração:Nos casos mais simples, você pode usar
enumerated()
com um loop for. Por exemplo:Observe, no entanto, que você não está limitado ao uso
enumerated()
com um loop for. De fato, se você planeja usarenumerated()
com um loop for para algo semelhante ao código a seguir, está fazendo algo errado:Uma maneira mais rápida de fazer isso é:
Como alternativa, você também pode usar
enumerated()
commap
:Além disso, embora tenha algumas limitações ,
forEach
pode ser um bom substituto para um loop for:Usando
enumerated()
emakeIterator()
, você pode até iterar manualmente no seuArray
. Por exemplo:fonte
enumerate
?Começando com o Swift 2, a função enumerar precisa ser chamada na coleção da seguinte maneira:
fonte
Encontrei esta resposta enquanto procurava uma maneira de fazer isso com um dicionário , e é muito fácil adaptá-la, basta passar uma tupla para o elemento.
fonte
Você pode simplesmente usar o loop de enumeração para obter o resultado desejado:
Swift 2:
Swift 3 e 4:
Ou você pode simplesmente passar por um loop for para obter o mesmo resultado:
Espero que ajude.
fonte
Enumerar básico
ou com Swift 3 ...
Enumerar, filtrar e mapear
No entanto, na maioria das vezes eu uso enumerar em combinação com mapa ou filtro. Por exemplo, com a operação em duas matrizes.
Nesta matriz, eu queria filtrar elementos ímpares ou pares e convertê-los de Ints para Doubles. Então
enumerate()
você obtém o índice e o elemento, o filtro verifica o índice e, finalmente, para se livrar da tupla resultante, mapeio-o apenas para o elemento.fonte
Usando
.enumerate()
obras, mas não fornece o verdadeiro índice do elemento; ele fornece apenas um início Int com 0 e incrementando 1 para cada elemento sucessivo. Isso geralmente é irrelevante, mas existe o potencial de comportamento inesperado quando usado com oArraySlice
tipo. Pegue o seguinte código:É um exemplo um tanto artificial e não é um problema comum na prática, mas ainda acho que vale a pena saber que isso pode acontecer.
fonte
it does not actually provide the true index of the element; it only provides an Int beginning with 0 and incrementing by 1 for each successive element
Sim, é por isso que é chamado enumerar . Além disso, a fatia não é matriz, portanto, nenhuma surpresa se comporta de maneira diferente. Não há bug aqui - tudo é por design. :)filter
primeiro?Começando com o Swift 3, é
fonte
Para garantir a integridade, você pode simplesmente percorrer os índices da matriz e usar subscrito para acessar o elemento no índice correspondente:
Usando o forEach
Usando o
enumerated()
método de coleção . Observe que ele retorna uma coleção de tuplas com oeoffset
oelement
:usando forEach:
Aqueles imprimirão
Se você precisar do índice da matriz (não do deslocamento) e de seu elemento, poderá estender a Collection e criar seu próprio método para obter os elementos indexados:
Outra implementação possível, como sugerido por Alex, é compactar os índices de coleção com seus elementos:
Teste:
Isso irá
fonte
enumeratedIndices
fazendo loop comzip(self.indices, self)
for element in zip(indices, self) { try body(element) }
. Btw eu não gosto do nome que eu escolhi,indexedElements
pode descrever melhor o que fazfor
loop funciona, mas tambémzip(self.indices, self) .forEach(body)
forEach
faz um loop for nos bastidores. Prefiro mantê-lo simples e simples github.com/apple/swift/blob/master/stdlib/public/core/…@inlinable public func forEach( _ body: (Element) throws -> Void ) rethrows { for element in self { try body(element) } } }
Esta é a fórmula do loop da enumeração:
para mais detalhes você pode conferir aqui .
fonte
Pessoalmente, prefiro usar o
forEach
método:Você também pode usar a versão curta:
fonte
Xcode 8 e Swift 3: a matriz pode ser enumerada usando
tempArray.enumerated()
Exemplo:
console:
fonte
Para quem quer usar
forEach
.Swift 4
Ou
fonte
Para o que você deseja fazer, use o
enumerated()
método em sua matriz :fonte
Chamamos função enumerar para implementar isso. gostar
fonte