如何遍历字典并检查每个项值类型?
示例字典:
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]
。他们必须采用不同的方法!
答案 0 :(得分:5)
您可以在swift中使用is
var dict = ([
"a number" : 1,
"a boolean" : false,
"a string" : "Hello"
])
for (key,value) in dict{
if value is String{
println(value)
}
}
你也可以获得className
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]
然后
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)
}
}
答案 1 :(得分:1)
从swift引用中,这里是如何遍历字典
迭代字典
您可以使用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)")
}
}
答案 2 :(得分:1)
您也可以使用dynamicType查找类,然后使用简单的switch语句来执行相应的操作
assert_equal session[:forwarding_url], user_path(@user)
答案 3 :(得分:0)
对于遇到警告问题的人,请确保将您的类型检查为上述@Leo。如果您的值类型是NSNumber,那么您将收到错误。如果NSObject类型使用@Leo's或@nPn的答案。
这对我的项目有用,其值类型为NSNumber:
for (key, value) in settings {
if value == value as Bool {
print(value)
}
if value == value as NSNumber {
print(value)
}
}