Swiftで辞書を反復処理する 質問する

Swiftで辞書を反復処理する 質問する

Swift プログラミング言語ガイドのこの実験に対して Xcode が示している回答に少し混乱しています。

// 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

辞書が横断されているときに、変数 に最大数が設定されていることは理解しています。しかし、Xcode が、各テストに応じて が 5 回、1 回、または 3 回設定されているlargestと言っている理由がわかりません。largest

コードを見ると、「Prime」だけで 6 回 (2、3、5、7、11、13) 設定する必要があることがわかります。次に、「Fibonacci」の数字はすべて最大値 (現在「Prime」では 13 に設定されています) より小さいため、スキップする必要があります。次に、「Square」で 16 に設定し、最後に 25 に設定して、合計 8 回にします。

何か明らかなことを見逃しているのでしょうか?

ベストアンサー1

Swift (および他の言語) の辞書は順序付けされていません。辞書を反復処理する場合、順序が初期化順序と一致するという保証はありません。この例では、Swift は他のキーよりも先に「Square」キーを処理します。ループに print ステートメントを追加すると、これを確認できます。25 は Square の 5 番目の要素であるため、Square の 5 つの要素に対して largest が 5 回設定され、その後 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

次のように出力されます:

kind: Square
kind: Prime
kind: Fibonacci

おすすめ記事