为嵌套的NSDictionary生成一个完整的键值编码路径列表?

我有一个包含键和值的NSDictionary ,并且一些值也将是NSDictionary s …到任意(但合理)级别。

我想获得所有有效KVC路径的列表,例如:

 { "foo" = "bar", "qux" = { "taco" = "delicious", "burrito" = "also delicious", } } 

我会得到:

 [ "foo", "qux", "qux.taco", "qux.burrito" ] 

有没有一种简单的方法可以做到这一点已经存在?

你可以通过allKeys递归。 显然,密钥是一个关键路径,然后如果值是NSDictionary,您可以递归和追加。

 - (void) obtainKeyPaths:(id)val intoArray:(NSMutableArray*)arr withString:(NSString*)s { if ([val isKindOfClass:[NSDictionary class]]) { for (id aKey in [val allKeys]) { NSString* path = (!s ? aKey : [NSString stringWithFormat:@"%@.%@", s, aKey]); [arr addObject: path]; [self obtainKeyPaths: [val objectForKey:aKey] intoArray: arr withString: path]; } } } 

以下是如何称呼它:

 NSMutableArray* arr = [NSMutableArray array]; [self obtainKeyPaths:d intoArray:arr withString:nil]; 

之后, arr包含您的关键路径列表。

这是我在马特回答后记下的一个Swift版本。

 extension NSDictionary { func allKeyPaths() -> Set { //Container for keypaths var keyPaths = Set() //Recursive function func allKeyPaths(forDictionary dict: NSDictionary, previousKeyPath path: String?) { //Loop through the dictionary keys for key in dict.allKeys { //Define the new keyPath guard let key = key as? String else { continue } let keyPath = path != nil ? "\(path!).\(key)" : key //Recurse if the value for the key is another dictionary if let nextDict = dict[key] as? NSDictionary { allKeyPaths(forDictionary: nextDict, previousKeyPath: keyPath) continue } //End the recursion and append the keyPath keyPaths.insert(keyPath) } } allKeyPaths(forDictionary: self, previousKeyPath: nil) return keyPaths } }