3

キーと値を含むがNSDictionaryあり、いくつかの値もNSDictionarys になります... 任意の (ただし妥当な) レベルまで。

すべての有効な KVC パスのリストを取得したいと思います。たとえば、次のようになります。

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

私は得るでしょう:

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

すでに存在するこれを行う簡単な方法はありますか?

4

2 に答える 2

3

を再帰できます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キー パスのリストが含まれます。

于 2013-05-11T00:05:06.583 に答える
1

これは、マットの回答からメモを取って書いたSwiftバージョンです。

extension NSDictionary {
    func allKeyPaths() -> Set<String> {
        //Container for keypaths
        var keyPaths = Set<String>()
        //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
    }
}
于 2016-02-23T14:44:16.147 に答える