2014-06-08 31 views
151

Tôi là một chút nhầm lẫn về câu trả lời rằng Xcode là cho tôi để thí nghiệm này trong Swift Programming Language Guide:lặp qua một từ điển trong 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 

Tôi hiểu rằng như từ điển đang được transversed, các số lớn nhất được đặt thành biến, largest. Tuy nhiên, tôi bối rối là tại sao Xcode đang nói rằng largest đang được đặt 5 lần, hoặc 1 lần, hoặc 3 lần, tùy thuộc vào từng thử nghiệm.

Khi xem qua mã, tôi thấy rằng nó phải được đặt 6 lần trong "Chỉ một mình" (2, 3, 5, 7, 11, 13). Sau đó, nó nên bỏ qua bất kỳ số nào trong "Fibonacci" vì tất cả các số này đều nhỏ hơn số lớn nhất, hiện được đặt là 13 từ "Prime". Sau đó, nó sẽ được đặt thành 16 và cuối cùng là 25 trong "Square", tổng cộng 8 lần.

Tôi có thiếu điều gì đó hoàn toàn hiển nhiên không?

Trả lời

250

Từ điển trong Swift (và các ngôn ngữ khác) không được đặt hàng. Khi bạn lặp qua từ điển, không có người bảo đảm rằng thứ tự sẽ khớp với thứ tự khởi tạo. Trong ví dụ này, Swift xử lý khóa "Square" trước những người khác. Bạn có thể thấy điều này bằng cách thêm lệnh in vào vòng lặp. 25 là yếu tố thứ 5 của Quảng trường rất lớn sẽ được thiết lập 5 lần trong 5 yếu tố trong Square và sau đó sẽ ở lại 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 

in này:

kind: Square 
kind: Prime 
kind: Fibonacci 
+0

Thank bạn rất nhiều! Tôi đã bối rối một chút. Tôi tiếp tục bổ sung và loại bỏ các con số cho mỗi khóa với hy vọng sẽ phân tích nó, nhưng tôi đã không nhận được bất cứ nơi nào. Lời giải thích của bạn rõ ràng rất được đánh giá cao! –

+0

Woot! Vui vì tôi có thể giúp :) – Dash

2

Mảng là bộ sưu tập được đặt hàng nhưng từ điển và bộ là bộ sưu tập không có thứ tự. Vì vậy, bạn không thể dự đoán thứ tự lặp lại trong từ điển hoặc tập hợp.

Đọc bài viết này để biết thêm về Collection Types: Swift Programming Language

5

Đây là một sự thay thế cho thử nghiệm đó (Swift 3.0). Điều này cho bạn biết chính xác loại số nào lớn nhất.

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

Kết quả sẽ là

("FirstName", "Maninder") ("LastName", "Singh") ("Địa chỉ", "Chandigarh")

+0

Bạn có thể cho tôi biết ví dụ này có hiệu quả hơn trong vòng lặp dữ liệu 1.000 không? Nguyên nhân tôi có một JSON lớn, do đó, nó đưa cho tôi một xử lý 1GB ở cuối. Các thiết bị mới hơn sẽ không sụp đổ, nhưng trong iPhone 5s 16GB của tôi bị hỏng trên một nửa số đó. –

Các vấn đề liên quan