2014-06-08 17 views
151

Sono un po 'confuso sulla risposta che Xcode mi sta dando a questo esperimento nella Guida Swift linguaggio di programmazione:scorrendo un dizionario a 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 

Capisco che come il dizionario viene transversed, il il numero più grande viene impostato sulla variabile, largest. Tuttavia, sono confuso dal motivo per cui Xcode sta dicendo che largest viene impostato 5 volte, o 1 volta o 3 volte, a seconda di ciascun test.

Guardando attraverso il codice, vedo che dovrebbe essere impostato 6 volte in "Prime" da solo (2, 3, 5, 7, 11, 13). Quindi dovrebbe saltare tutti i numeri in "Fibonacci" poiché quelli sono tutti inferiori al più grande, che è attualmente impostato a 13 da "Prime". Quindi, dovrebbe essere impostato su 16 e infine 25 su "Square", ottenendo un totale di 8 volte.

Mi manca qualcosa di completamente ovvio?

risposta

250

I dizionari in Swift (e altre lingue) non sono ordinati. Quando si scorre il dizionario, non c'è garanzia che l'ordine corrisponda all'ordine di inizializzazione. In questo esempio, Swift elabora il tasto "Square" prima degli altri. Puoi vederlo aggiungendo un'istruzione di stampa al ciclo. 25 è il 5 ° elemento della piazza così grande sarebbe essere impostato 5 volte per i 5 elementi in piazza e poi sarebbe rimasto a 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 

Questo stampa:

kind: Square 
kind: Prime 
kind: Fibonacci 
+0

Grazie tu così tanto! Sono stato perplesso per un po '. Continuavo ad aggiungere e rimuovere i numeri per ogni chiave nella speranza di sezionarlo, ma non andavo da nessuna parte. La tua spiegazione è chiara e molto apprezzata! –

+0

Woot! Sono contento di poter aiutare :) – Dash

2

Gli array sono raccolte ordinate ma dizionari e set sono raccolte non ordinate. Quindi non è possibile prevedere l'ordine di iterazione in un dizionario o in un set.

Leggi questo articolo per sapere di più su Collection Types: Swift Programming Language

5

Ecco un'alternativa per l'esperimento (Swift 3.0). Questo ti dice esattamente quale tipo di numero era il più grande.

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 
5
let dict : [String : Any] = ["FirstName" : "Maninder" , "LastName" : "Singh" , "Address" : "Chandigarh"] 
dict.forEach { print($0) } 

risultato sarebbe

("FirstName", "Maninder") ("Cognome", "Singh") ("Indirizzo", "Chandigarh")

+0

Potresti dirmi se questo esempio è più efficiente in un ciclo di 1000 dati? Perché ho un JSON così grande, quindi mi ci vuole un 1 GB di elaborazione alla fine. I nuovi dispositivi non si bloccheranno, ma nel mio iphone 5s 16 GB si bloccherà a metà di quello. –

Problemi correlati