Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 循环浏览字典并检查每个值类型_Swift_Loops_Dictionary_Swift2 - Fatal编程技术网

Swift 循环浏览字典并检查每个值类型

Swift 循环浏览字典并检查每个值类型,swift,loops,dictionary,swift2,Swift,Loops,Dictionary,Swift2,如何循环浏览字典并检查每个项值类型 示例字典: 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 { i

如何循环浏览字典并检查每个项值类型

示例字典:

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所指出的,在比较时跟踪字典的值类型是很重要的。作为示例,我包含的字典类型为
[String:NSObject]
,而我项目中的字典类型为
[String:NSNumber]
。必须以不同的方式对待他们

根据swift参考,下面是如何迭代字典

翻阅字典

您可以使用for-in在字典中迭代键值对 环字典中的每个项都作为(键、值)元组返回, 您可以将元组的成员分解为临时常量或 作为迭代一部分的变量:

所以这应该适用于你的例子

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

您可以在swift中使用
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,
        ])
 var dict = ([
        "a number" : 1,
        "a boolean" : false,
        "a string" : "Hello"
        ])
dict的类型为
[String:NSNumber]
,因此无需检查

但是,如果你有这样一本字典

var dict = ([
        "a number" : 1,
        "a boolean" : false,
        ])
 var dict = ([
        "a number" : 1,
        "a boolean" : false,
        "a string" : "Hello"
        ])
然后dict是
[String:NSObject]
的类型,在这种情况下,您需要检查类型

更新,检查是Int还是Bool

最好将词典声明为
[字符串:Any]
然后


对于那些有警告问题的人,请确保按照上面所述的@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)
    }
}

还可以使用dynamicType查找类,然后使用简单的switch语句执行相应的操作


是的,let as更有意义吗?如果只是想检查值类型,我认为
就足够了。因为,如果它是类型,我们不需要强制转换。另外,
let as?
也是一种很好的方法,我以前试过,现在又试过。它抛出一个警告,说“is”测试总是正确的“我正在按照您在第一个代码块中所做的方式来做”。除了我在查一个NSN号码。有什么想法吗?那么最终的解决方案是什么呢?我认为你的设置值都是
NSNumber
类型,因此它会提醒你你是正确的,这就是我选择你的作为答案的原因。我不明白,如果我在示例中包含一个字符串,它会改变整个对象类型。我在项目中的类型确实是一个NSNumber。我已经将此作为对未来遇到与我相同困惑的其他人的回答。谢谢@LeoThis真的很棒。我明天一定要测试一下。谢谢@nPn,+1
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
  }
}