swift中如何递归遍历NSDictionary
How to recursively traverse NSDictionary in swift
我正在编写一个应用程序,我需要实现的功能之一要求该应用程序从网站中提取 JSON 数据,将其存储在字典中,然后能够使用所有键并显示值。我不知道字典的结构会是什么样子,所以我希望递归遍历字典以检索所有信息。
我将 JSON 存储在我需要的网站字典中,当我将字典变量放入 println() 语句时,它会正确显示。
I found this link 我认为这个,或者这个的一些变体应该有用,但我对 swift 还是很陌生,我不确定这如何从 Objective-c 转换为swift.
我感兴趣的 link 部分是:
(void)enumerateJSONToFindKeys:(id)object forKeyNamed:(NSString *)keyName
{
if ([object isKindOfClass:[NSDictionary class]])
{
// If it's a dictionary, enumerate it and pass in each key value to check
[object enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) {
[self enumerateJSONToFindKeys:value forKeyNamed:key];
}];
}
else if ([object isKindOfClass:[NSArray class]])
{
// If it's an array, pass in the objects of the array to check
[object enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[self enumerateJSONToFindKeys:obj forKeyNamed:nil];
}];
}
else
{
// If we got here (i.e. it's not a dictionary or array) so its a key/value that we needed
NSLog(@"We found key %@ with value %@", keyName, object);
}
}
我不确定该怎么做,如有任何帮助或正确方向的指示,我们将不胜感激。谢谢!
编辑:这是我开始的方向,但有很多错误。我试图修复它们,但运气不佳。
func enumerateJSONToFindKeys(id:AnyObject, keyName:NSString){
if id.isKindOfClass(NSDictionary)
{
AnyObject.enumerateKeysAndObjectsUsingBlock(id.key, id.value, stop:Bool())
{
self.enumerateJSONToFindKeys(id.value, forKeyNamed: keyName)
}
}
else if id.isKindOfClass(NSArray)
{
}
}
试试这个:
func enumerateJSONToFindKeys(object:AnyObject, forKeyNamed named:String?) {
if let dict = object as? NSDictionary {
for (key, value) in dict {
enumerateJSONToFindKeys(value, forKeyNamed: key as? String)
}
}
else if let array = object as? NSArray {
for value in array {
enumerateJSONToFindKeys(value, forKeyNamed: nil)
}
}
else {
println("found key \(named) value \(object)")
}
}
它使用 Swift as?
条件转换运算符以及对 NSDictionary 和 NSArray 的原生迭代。
我正在编写一个应用程序,我需要实现的功能之一要求该应用程序从网站中提取 JSON 数据,将其存储在字典中,然后能够使用所有键并显示值。我不知道字典的结构会是什么样子,所以我希望递归遍历字典以检索所有信息。
我将 JSON 存储在我需要的网站字典中,当我将字典变量放入 println() 语句时,它会正确显示。
I found this link 我认为这个,或者这个的一些变体应该有用,但我对 swift 还是很陌生,我不确定这如何从 Objective-c 转换为swift.
我感兴趣的 link 部分是:
(void)enumerateJSONToFindKeys:(id)object forKeyNamed:(NSString *)keyName
{
if ([object isKindOfClass:[NSDictionary class]])
{
// If it's a dictionary, enumerate it and pass in each key value to check
[object enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) {
[self enumerateJSONToFindKeys:value forKeyNamed:key];
}];
}
else if ([object isKindOfClass:[NSArray class]])
{
// If it's an array, pass in the objects of the array to check
[object enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[self enumerateJSONToFindKeys:obj forKeyNamed:nil];
}];
}
else
{
// If we got here (i.e. it's not a dictionary or array) so its a key/value that we needed
NSLog(@"We found key %@ with value %@", keyName, object);
}
}
我不确定该怎么做,如有任何帮助或正确方向的指示,我们将不胜感激。谢谢!
编辑:这是我开始的方向,但有很多错误。我试图修复它们,但运气不佳。
func enumerateJSONToFindKeys(id:AnyObject, keyName:NSString){
if id.isKindOfClass(NSDictionary)
{
AnyObject.enumerateKeysAndObjectsUsingBlock(id.key, id.value, stop:Bool())
{
self.enumerateJSONToFindKeys(id.value, forKeyNamed: keyName)
}
}
else if id.isKindOfClass(NSArray)
{
}
}
试试这个:
func enumerateJSONToFindKeys(object:AnyObject, forKeyNamed named:String?) {
if let dict = object as? NSDictionary {
for (key, value) in dict {
enumerateJSONToFindKeys(value, forKeyNamed: key as? String)
}
}
else if let array = object as? NSArray {
for value in array {
enumerateJSONToFindKeys(value, forKeyNamed: nil)
}
}
else {
println("found key \(named) value \(object)")
}
}
它使用 Swift as?
条件转换运算符以及对 NSDictionary 和 NSArray 的原生迭代。