Iterando Através de um Dicionário no Swift

Estou um pouco confuso com a resposta que o Xcode está me dando para essa experiência no Guia de Linguagem de Programação Swift:

// Use a for-in to iterate through a dictionary (experiment) let interestingNumbers = [ "Prime": [2, 3, 5, 7, 11, 13], "Fibonacci": [1, 1, 2, 3, 5, 8], "Square": [1, 4, 9, 16, 25] ] var largest = 0 for (kind, numbers) in interestingNumbers { for number in numbers { if number > largest { largest = number } } } largest 

Eu entendo que, como o dictionary está sendo transpassado, o maior número está sendo definido para a variável largest . No entanto, estou confuso sobre o motivo pelo qual o Xcode está dizendo que o largest está sendo definido 5 vezes, ou 1 vez ou 3 vezes, dependendo de cada teste.

Ao olhar através do código, vejo que deve ser definido 6 vezes em “Prime” sozinho (2, 3, 5, 7, 11, 13). Em seguida, ele deve pular todos os números em “Fibonacci”, uma vez que todos são menores que o maior, que está atualmente definido como 13 de “Prime”. Em seguida, deve ser definido como 16 e, finalmente, 25 em “Square”, produzindo um total de 8 vezes.

Eu estou sentindo falta de algo inteiramente óbvio?

Dicionários em Swift (e outros idiomas) não são ordenados. Quando você percorre o dictionary, não há garantia de que o pedido corresponderá à ordem de boot. Neste exemplo, o Swift processa a chave “Square” antes dos outros. Você pode ver isso adicionando uma instrução print ao loop. 25 é o 5º elemento do quadrado, então o maior seria definido 5 vezes para os 5 elementos do quadrado e então ficaria em 25.

 let interestingNumbers = [ "Prime": [2, 3, 5, 7, 11, 13], "Fibonacci": [1, 1, 2, 3, 5, 8], "Square": [1, 4, 9, 16, 25] ] var largest = 0 for (kind, numbers) in interestingNumbers { println("kind: \(kind)") for number in numbers { if number > largest { largest = number } } } largest 

Isso imprime:

 kind: Square kind: Prime kind: Fibonacci 
 let dict : [String : Any] = ["FirstName" : "Maninder" , "LastName" : "Singh" , "Address" : "Chandigarh"] dict.forEach { print($0) } 

Resultado seria

(“FirstName”, “Maninder”) (“LastName”, “Singh”) (“Endereço”, “Chandigarh”)

Aqui está uma alternativa para esse experimento (Swift 3.0). Isso indica exatamente qual tipo de número é o maior.

 let interestingNumbers = [ "Prime": [2, 3, 5, 7, 11, 13], "Fibonacci": [1, 1, 2, 3, 5, 8], "Square": [1, 4, 9, 16, 25], ] var largest = 0 var whichKind: String? = nil for (kind, numbers) in interestingNumbers { for number in numbers { if number > largest { whichKind = kind largest = number } } } print(whichKind) print(largest) OUTPUT: Optional("Square") 25 

Arrays são collections ordenadas, mas dictionarys e conjuntos são collections não ordenadas. Assim, você não pode prever a ordem da iteração em um dictionary ou conjunto.

Leia este artigo para saber mais sobre os tipos de coleta: Linguagem de programação rápida