2014-06-08 18 views
151

jestem trochę zdezorientowany na odpowiedź, że Xcode daje mi do tego eksperymentu w Swift Programming Language Guide:iteracja słownika w 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 

Rozumiem, że jako słownika jest transversed The największa liczba jest ustawiana na zmienną, largest. Jednak nie rozumiem, dlaczego Xcode mówi, że largest jest ustawiane 5 razy, 1 raz lub 3 razy, w zależności od każdego testu.

Podczas przeglądania kodu widzę, że powinien on być ustawiony 6 razy w samym "Prime" (2, 3, 5, 7, 11, 13). Następnie należy pominąć wszystkie cyfry w "Fibonacci", ponieważ wszystkie są mniejsze niż największe, które są obecnie ustawione na 13 z "Prime". Następnie należy ustawić na 16, a na końcu na 25 w "Kwadrat", uzyskując w sumie 8 razy.

Czy brakuje mi czegoś całkowicie oczywistego?

Odpowiedz

250

Słowniki w języku Swift (i innych językach) nie są uporządkowane. Podczas przeglądania słownika nie ma gwarancji, że zamówienie będzie zgodne z kolejnością inicjowania. W tym przykładzie Swift przetwarza klucz "Kwadrat" przed innymi. Możesz to zobaczyć, dodając instrukcję print do pętli. 25 jest 5 elementem placu więc największym byłby zestaw 5 razy na 5 elementów na placu, a następnie zatrzymam się w 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 

Drukuje:

kind: Square 
kind: Prime 
kind: Fibonacci 
+0

Thank ty tak bardzo! Byłem zaskoczony przez chwilę. Ciągle dodawałam i usuwałam numery dla każdego klucza w nadziei, że go przeanalizuję, ale nigdzie się nie dostałem. Twoje wyjaśnienie jest bardzo doceniane! –

+0

Woot! Cieszę się, że mogłem pomóc :) – Dash

2

Tablice są zamówione kolekcje, ale słowniki i zestawy to nieuporządkowane kolekcje. W ten sposób nie można przewidzieć kolejność iteracji w słowniku lub zestawie.

Przeczytaj ten artykuł, aby dowiedzieć się więcej o Collection Types: Swift Programming Language

5

Oto alternatywa dla tego eksperymentu (SWIFT 3.0). To dokładnie pokazuje, który numer był największy.

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) } 

Wynik byłby

("FirstName", "Maninder") ("Nazwisko", "Singh") ("Adres", "Chandigarh")

+0

Czy możesz mi powiedzieć, czy ten przykład jest bardziej wydajny w 1000 pętli danych? Ponieważ mam tak duży JSON, więc na końcu zajmuję się przetwarzaniem 1GB. Nowsze urządzenia nie ulegną awarii, ale w moim iPhone 5s 16GB awarii na połowę tego. –