Existe uma função que eu possa usar para iterar em um array e ter índice e elemento, como o do Python enumerate?
for index, element in enumerate(list):
...
Sim. A partir do Swift 3.0, se você precisar do índice de cada elemento junto com seu valor, poderá usar o enumerated()método para iterar no array. Ele retorna uma sequência de pares composta pelo índice e o valor de cada item da matriz. Por exemplo:
for (index, element) in list.enumerated() {
print("Item \(index): \(element)")
}
Antes do Swift 3.0 e depois do Swift 2.0, a função era chamada enumerate():
for (index, element) in list.enumerate() {
print("Item \(index): \(element)")
}
Antes do Swift 2.0, enumerateera uma função global.
for (index, element) in enumerate(list) {
println("Item \(index): \(element)")
}
Swift 5 fornece um método chamado enumerated()para Array. enumerated()tem a seguinte declaração:
func enumerated() -> EnumeratedSequence<Array<Element>>
Retorna uma sequência de pares (n, x), onde n representa um número inteiro consecutivo começando em zero e x representa um elemento da sequência.
Nos casos mais simples, você pode usar enumerated()com um loop for. Por exemplo:
let list = ["Car", "Bike", "Plane", "Boat"]
for (index, element) in list.enumerated() {
print(index, ":", element)
}
/*
prints:
0 : Car
1 : Bike
2 : Plane
3 : Boat
*/
Observe, entretanto, que você não está limitado ao uso enumerated()com um loop for. Na verdade, se você planeja usar enumerated()um loop for para algo semelhante ao código a seguir, está fazendo isso errado:
let list = [Int](1...5)
var arrayOfTuples = [(Int, Int)]()
for (index, element) in list.enumerated() {
arrayOfTuples += [(index, element)]
}
print(arrayOfTuples) // prints [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]
Uma maneira mais rápida de fazer isso é:
let list = [Int](1...5)
let arrayOfTuples = Array(list.enumerated())
print(arrayOfTuples) // prints [(offset: 0, element: 1), (offset: 1, element: 2), (offset: 2, element: 3), (offset: 3, element: 4), (offset: 4, element: 5)]
Como alternativa, você também pode usar enumerated()com map:
let list = [Int](1...5)
let arrayOfDictionaries = list.enumerated().map { (a, b) in return [a : b] }
print(arrayOfDictionaries) // prints [[0: 1], [1: 2], [2: 3], [3: 4], [4: 5]]
Além disso, embora tenha algumas limitações , forEachpode ser um bom substituto para um loop for:
let list = [Int](1...5)
list.reversed().enumerated().forEach { print($0, ":", $1) }
/*
prints:
0 : 5
1 : 4
2 : 3
3 : 2
4 : 1
*/
Usando enumerated()e makeIterator(), você pode até mesmo iterar manualmente no seu Array. Por exemplo:
import UIKit
import PlaygroundSupport
class ViewController: UIViewController {
var generator = ["Car", "Bike", "Plane", "Boat"].enumerated().makeIterator()
override func viewDidLoad() {
super.viewDidLoad()
let button = UIButton(type: .system)
button.setTitle("Tap", for: .normal)
button.frame = CGRect(x: 100, y: 100, width: 100, height: 100)
button.addTarget(self, action: #selector(iterate(_:)), for: .touchUpInside)
view.addSubview(button)
}
@objc func iterate(_ sender: UIButton) {
let tuple = generator.next()
print(String(describing: tuple))
}
}
PlaygroundPage.current.liveView = ViewController()
/*
Optional((offset: 0, element: "Car"))
Optional((offset: 1, element: "Bike"))
Optional((offset: 2, element: "Plane"))
Optional((offset: 3, element: "Boat"))
nil
nil
nil
*/
Começando com Swift 2, a função enumerar precisa ser chamada na coleção assim:
for (index, element) in list.enumerate() {
print("Item \(index): \(element)")
}
Eu encontrei essa resposta enquanto procurava uma maneira de fazer isso com um Dicionário , e descobri que é bem fácil adaptá-lo, basta passar uma tupla para o elemento.
// Swift 2
var list = ["a": 1, "b": 2]
for (index, (letter, value)) in list.enumerate() {
print("Item \(index): \(letter) \(value)")
}
Você pode simplesmente usar o loop de enumeração para obter o resultado desejado:
Swift 2:
for (index, element) in elements.enumerate() {
print("\(index): \(element)")
}
Swift 3 e 4:
for (index, element) in elements.enumerated() {
print("\(index): \(element)")
}
Ou você pode simplesmente passar por um loop for para obter o mesmo resultado:
for index in 0..<elements.count {
let element = elements[index]
print("\(index): \(element)")
}
Espero que ajude.
Para completar, você pode simplesmente iterar seus índices de array e usar subscrito para acessar o elemento no índice correspondente:
let list = [100,200,300,400,500]
for index in list.indices {
print("Element at:", index, " Value:", list[index])
}
Usando forEach
list.indices.forEach {
print("Element at:", $0, " Value:", list[$0])
}
Usando enumerated()método de coleta . Observe que ele retorna uma coleção de tuplas com o offsete o element:
for item in list.enumerated() {
print("Element at:", item.offset, " Value:", item.element)
}
usando forEach:
list.enumerated().forEach {
print("Element at:", $0.offset, " Value:", $0.element)
}
Esses vão imprimir
Elemento em: 0 Valor: 100
Elemento em: 1 Valor: 200
Elemento em: 2 Valor: 300
Elemento em: 3 Valor: 400
Elemento em: 4 Valor: 500
Se você precisar do índice da matriz (não do deslocamento) e seu elemento, você pode estender Collection e criar seu próprio método para obter os elementos indexados:
extension Collection {
func indexedElements(body: ((index: Index, element: Element)) throws -> Void) rethrows {
var index = startIndex
for element in self {
try body((index,element))
formIndex(after: &index)
}
}
}
Outra implementação possível, conforme sugerido por Alex, é compactar os índices da coleção com seus elementos:
extension Collection {
func indexedElements(body: ((index: Index, element: Element)) throws -> Void) rethrows {
for element in zip(indices, self) { try body(element) }
}
var indexedElements: Zip2Sequence<Indices, Self> { zip(indices, self) }
}
Teste:
let list = ["100","200","300","400","500"]
// You can iterate the index and its elements using a closure
list.dropFirst(2).indexedElements {
print("Index:", $0.index, "Element:", $0.element)
}
// or using a for loop
for (index, element) in list.indexedElements {
print("Index:", index, "Element:", element)
}
Isso vai p [rintar
Índice: 2 Elemento: 300
Índice: 3 Elemento: 400
Índice: 4 Elemento: 500
Índice: 0 Elemento: 100
Índice: 1 Elemento: 200
Índice: 2 Elemento: 300
Índice: 3 Elemento: 400
Índice: 4 Elemento: 500
for (index, element) in arrayOfValues.enumerate() {
// do something useful
}
ou com Swift 3 ...
for (index, element) in arrayOfValues.enumerated() {
// do something useful
}
No entanto, costumo usar enumerar em combinação com mapa ou filtro. Por exemplo, ao operar em alguns arrays.
Nesta matriz, eu queria filtrar elementos indexados pares ou ímpares e convertê-los de Ints em Doubles. Assim, enumerate()obtém o índice e o elemento, o filtro verifica o índice e, finalmente, para me livrar da tupla resultante, mapeio apenas para o elemento.
let evens = arrayOfValues.enumerate().filter({
(index: Int, element: Int) -> Bool in
return index % 2 == 0
}).map({ (_: Int, element: Int) -> Double in
return Double(element)
})
let odds = arrayOfValues.enumerate().filter({
(index: Int, element: Int) -> Bool in
return index % 2 != 0
}).map({ (_: Int, element: Int) -> Double in
return Double(element)
})
Usando .enumerate()funciona, mas não fornece o índice verdadeiro do elemento; ele fornece apenas um Int começando com 0 e incrementando em 1 para cada elemento sucessivo. Isso geralmente é irrelevante, mas existe o potencial para um comportamento inesperado quando usado com o ArraySlicetipo. Pegue o seguinte código:
let a = ["a", "b", "c", "d", "e"]
a.indices //=> 0..<5
let aSlice = a[1..<4] //=> ArraySlice with ["b", "c", "d"]
aSlice.indices //=> 1..<4
var test = [Int: String]()
for (index, element) in aSlice.enumerate() {
test[index] = element
}
test //=> [0: "b", 1: "c", 2: "d"] // indices presented as 0..<3, but they are actually 1..<4
test[0] == aSlice[0] // ERROR: out of bounds
É 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.
Começando com Swift 3, é
for (index, element) in list.enumerated() {
print("Item \(index): \(element)")
}
Esta é a Fórmula do loop de Enumeração:
for (index, value) in shoppingList.enumerate() {
print("Item \(index + 1): \(value)")
}
para mais detalhes você pode verificar aqui .
Eu pessoalmente prefiro usar o forEachmétodo:
list.enumerated().forEach { (index, element) in
...
}
Você também pode usar a versão curta:
list.enumerated().forEach { print("index: \($0.0), value: \($0.1)") }
Xcode 8 e Swift 3: Array pode ser enumerado usando tempArray.enumerated()
Exemplo:
var someStrs = [String]()
someStrs.append("Apple")
someStrs.append("Amazon")
someStrs += ["Google"]
for (index, item) in someStrs.enumerated()
{
print("Value at index = \(index) is \(item)").
}
console:
Value at index = 0 is Apple
Value at index = 1 is Amazon
Value at index = 2 is Google
Para quem deseja usar forEach.
Swift 4
extension Array {
func forEachWithIndex(_ body: (Int, Element) throws -> Void) rethrows {
try zip((startIndex ..< endIndex), self).forEach(body)
}
}
Ou
array.enumerated().forEach { ... }
Para o que deseja fazer, você deve usar o enumerated()método em seu Array :
for (index, element) in list.enumerated() {
print("\(index) - \(element)")
}
Jana Duggar foi aberta sobre sua busca pelo amor. Aqui está tudo o que ela disse sobre o assunto e sua janela de cinco anos para o casamento.
O astro de 'Outlander', Sam Heughan, revelou recentemente o que vai levar do set para relembrar Jamie Fraser, o papel que o tornou uma estrela.
'She Loves You' foi escrita em uma hora, gravada em um dia, e foi a música dos Beatles com uma de suas melhores apresentações de sua carreira.
Dolly Parton e sua avó Bessie tiveram um relacionamento especial. Vovó Parton estava muito doente, mas isso não impediu Dolly de pregar uma peça nela.
Você pode achar que o carvalho ou a nogueira são madeiras resistentes, mas quando se trata da madeira mais dura do mundo, elas nem chegam perto.
O oceano é repleto de beleza, mas também esconde algumas das criaturas marinhas mais assustadoras do planeta. Muitos desses animais espreitam nas profundezas do oceano, no mundo escuro e de alta pressão do fundo do mar.
Se você está enfrentando criaturas hostis ou se preparando para cenários PvP, conhecer os melhores encantamentos de espada no Minecraft pode te dar uma grande vantagem. Encantar espadas permite causar mais dano, aumentar a quantidade de itens obtidos de criaturas e prolongar a durabilidade da sua espada.
Quando as pessoas falam sobre países socialistas, geralmente imaginam o controle total do governo e a ausência de propriedade privada. Mas, na prática, as economias socialistas variam muito.
“Children” traz uma participação especial de grande nome e algumas notícias devastadoras
Este RAV4 está em excelentes condições e está preparado para um jogo de cadeiras musicais.
Imagens de drone capturaram bombeiros parecendo lutar para apagar o incêndio.
Eyes of Wakanda está diretamente relacionado ao MCU, além de atualizações sobre X-Men '97, What If..., Demolidor e muito mais.
O anel de noivado de Kate Middleton pertenceu à Princesa Diana antes do Príncipe William pedi-la em casamento. Descubra tudo o que há para saber sobre a peça histórica aqui.
John Cleese se casou com sua esposa, Jennifer Wade, em 2012. Aqui está tudo o que você precisa saber sobre a esposa de John Cleese, Jennifer Wade.
Patton Oswalt se casou com sua esposa, a também atriz Meredith Salenger, em 2017. Aqui está tudo o que você precisa saber sobre a esposa de Patton Oswalt, Meredith Salenger.
Mena Suvari é casada com o marido Michael Hope desde 2018. Aqui está tudo o que você precisa saber sobre o marido de Mena Suvari.
Isso me atinge De repente, como tantas vezes acontece É o meio do caminho tudo de novo <Não, não aquele no Pacífico, seu marrom, aquele no carnaval> Todas as manchetes em voz alta…..
Em 2022, com o lançamento do GPT-3, a habilidade de escrita parece se tornar menos importante. Com a IA, pessoas com redação ruim também podem gerar funcionários de qualidade.
No mundo acelerado e competitivo de hoje, a carreira desempenha um papel significativo no crescimento pessoal, na estabilidade financeira e na satisfação geral com a vida. No entanto, muitos indivíduos encontram-se presos em um ciclo implacável de estagnação e insatisfação, definhando gradualmente em suas vidas profissionais.
Na semana passada, notei um comunicado de imprensa, enviado via PressGazette (um site de notícias da mídia britânica). O artigo anunciava que a Acast, a empresa de publicidade e hospedagem de podcast Scandi, lideraria um consórcio de "provavelmente os editores mais influentes" em podcasting.