web-dev-qa-db-ja.com

Swiftの辞書を繰り返し処理する

私は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)設定する必要があります。それから、それらはすべて「プライム」から13に現在設定されている最大より小さいので、それはそれが「フィボナッチ」のどんな数でもスキップするべきです。それから、それは16に設定されるべきです、そして最後に「正方形」で25、合計8回をもたらすこと。

私は完全に明白な何かを逃していますか?

193
Nick Kohrn

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
318
Dash

これはその実験の代替案です(Swift 3.0)。これは、どの種類の数が最も大きいかを正確に示しています。

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

結果は

( "FirstName"、 "Maninder")( "LastName"、 "Singh")( "Address"、 "Chandigarh")

11

これは、辞書を反復処理するためのユーザー定義関数です。

func findDic(dict: [String: String]){
    for (key, value) in dict{
    print("\(key) : \(value)")
  }
}

findDic(dict: ["Animal":"Lion", "Bird":"Sparrow"])
//prints Animal : Lion 
         Bird : Sparrow
4
Rawand Saeed

配列は順序付けられたコレクションですが、辞書とセットは順序付けられていないコレクションです。したがって、辞書や集合の中で反復の順序を予測することはできません。

コレクション型についての詳細を知るためにこの記事を読んでください:Swift Programming Language

4
Rachit Rawat

すべての値を反復処理したい場合は、

dict.values.forEach { value in
    // print(value)
}
2
norbDEV

このように、values.makeIterator()を使用して辞書の値を反復することもできます。

for sb in sbItems.values.makeIterator(){
    // do something with your sb item..
    print(sb)
}

このように、もっと気の利いたスタイルで反復を実行することもできます。

sbItems.values.makeIterator().forEach{
    // $0 is your dict value..
    print($0) 
}

* sbItems[String : NSManagedObject]型の辞書です

0