1. ホーム
  2. dictionary

[解決済み] Swiftで辞書を繰り返し使用する

2022-02-08 04:58:11

質問

私は、XcodeがSwift Programming Language Guideのこの実験に対して私に与えている答えに少し混乱しています。

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

辞書を横取りしているうちに、一番大きな数字が変数にセットされるようになったということですね。 largest . しかし、私はなぜ Xcode が次のように言っているのか混乱しています。 largest が5回設定されていたり、1回設定されていたり、3回設定されていたり、それぞれのテストによって異なります。

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

私は、全く当たり前のことを見逃しているのでしょうか?

どのように解決するのですか?

Swift (および他の言語) の辞書は順序付けされていません。辞書を通して反復するとき、順序が初期化順序と一致する保証はありません。この例では、Swift は他のキーの前に "Square" キーを処理します。ループに print 文を追加することで、これを見ることができます。25はSquareの5番目の要素なので、最大のものはSquareの5つの要素のために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