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