2

辞書をループして各項目の値の型を確認するにはどうすればよいですか?

辞書の例:

var dict = ([
    "a number" : 1,
    "a boolean" : false,
    "a string" : "Hello"
])

値をチェックする私の試み:

for item in dict.1 {
    if let current = item as? NSNumber {
        print(current)
    }
}

そして私はこれを試しました:

for item in settings {
    if item[1] == item[1] as NSNumber {
        print(item)
    }
}

重要な注意点:

@Leo が指摘したように、比較中に辞書の値の型を追跡することが重要です。例として含めた辞書は type[String : NSObject]であり、プロジェクトの辞書は type[String : NSNumber]でした。彼らは異なる方法でアプローチする必要があります!

4

4 に答える 4

5

isスピーディーにご利用いただけます

var dict = ([
    "a number" : 1,
    "a boolean" : false,
    "a string" : "Hello"
])

for (key,value) in dict{
    if value is String{
        println(value)
    }
}

また、クラス名を取得できます

for (key,value) in dict{
   println(String.fromCString(object_getClassName(value)))

}

これはログに記録されます

Optional("__NSCFString")
Optional("__NSCFNumber")
Optional("__NSCFBoolean")

アップデート:

Swift は型安全な言語なので、このような辞書があれば

var dict = ([
        "a number" : 1,
        "a boolean" : false,
        ])

dict は のタイプ[String : NSNumber]なので、チェックする必要はありません。

でも、こういう辞書があれば

 var dict = ([
        "a number" : 1,
        "a boolean" : false,
        "a string" : "Hello"
        ])

次に、 dict の[String:NSObject]タイプです。この場合、タイプを確認する必要があります。

更新、Int または Bool かどうかを確認

[String:Any] Thenに辞書を宣言する方が良い

      var dict:[String:Any] = ([
        "a number" : 1,
        "a boolean" : false,
        ])

    for (key,value) in dict{
        if value is Bool{
            println(value)
       }
        if value is Int{
            println(value)
        }
    }
于 2015-06-11T01:25:33.460 に答える
1

迅速な参照から、辞書を反復処理する方法は次のとおりです

ディクショナリの反復

for-in ループを使用して、ディクショナリ内のキーと値のペアを反復処理できます。ディクショナリ内の各項目は (キー、値) タプルとして返され、タプルのメンバーを反復の一部として一時的な定数または変数に分解できます。

for (airportCode, airportName) in airports {
        println("\(airportCode): \(airportName)")
    }
    // YYZ: Toronto Pearson
    // LHR: London Heathrow

したがって、これはあなたの例でうまくいくはずです。

var dict = ([
  "a number" : 1,
  "a boolean" : false,
  "a string" : "Hello"
  ])


for (k,v) in dict {
  if let x = v as? NSNumber {
    println("x = \(x)")
  }
}
于 2015-06-11T01:25:04.360 に答える
1

また、dynamicType を使用してクラスを検索し、単純な switch ステートメントを使用して適切なアクションを実行することもできます

var dict = ([
  "a number" : 1,
  "a boolean" : false,
  "astring" : "Hello"
  ])

for (k,v) in dict {
  switch "\(v.dynamicType)" {
    case "__NSCFString":
      println("found String = \(v)")
    case "__NSCFBoolean":
      println("found Boolean = \(v as! Bool)")
    case "__NSCFNumber":
      println("found Number = \(v)")
    default:break
  }
}
于 2015-06-11T03:26:12.343 に答える
0

警告に問題がある場合は、上記の @Leo のようにタイプを確認してください。値の型が NSNumber の場合、エラーが発生します。タイプが NSObject の場合は、@Leo または @nPn の回答を使用してください。

ここに画像の説明を入力

これは、値の型が NSNumber である私のプロジェクトで機能しています。

for (key, value) in settings {

    if value == value as Bool {
        print(value)
    }
    if value == value as NSNumber {
        print(value)
    }
}
于 2015-06-11T01:43:31.373 に答える