为嵌套的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 } }