2

階層化された NSMutableDictionary オブジェクトがあり、階層のより深い階層にある辞書を削除できるようにしたいと考えています。removeObjectAtKeyPath のようなメソッドなど、これをすばやく簡単に行う方法はありますか? 見つからないようです。

ありがとう!

4

5 に答える 5

4

何も組み込まれていませんが、基本的なカテゴリメソッドは問題なく機能します。

@implementation NSMutableDictionary (WSSNestedMutableDictionaries)

- (void)WSSRemoveObjectForKeyPath: (NSString *)keyPath
{
    // Separate the key path
    NSArray * keyPathElements = [keyPath componentsSeparatedByString:@"."];
    // Drop the last element and rejoin the path
    NSUInteger numElements = [keyPathElements count];
    NSString * keyPathHead = [[keyPathElements subarrayWithRange:(NSRange){0, numElements - 1}] componentsJoinedByString:@"."];
    // Get the mutable dictionary represented by the path minus that last element
    NSMutableDictionary * tailContainer = [self valueForKeyPath:keyPathHead];
    // Remove the object represented by the last element
    [tailContainer removeObjectForKey:[keyPathElements lastObject]];
}

@end

注意:これに、パスの最後から2番目の要素(おそらく別の要素にtailContainer応答するもの)が必要です。そうでない場合は、ブーム!removeObjectForKey:NSMutableDictionary

于 2013-02-27T07:28:12.887 に答える
0

カテゴリを作成できます:

これは最大1レベル下です:

#import "NSMutableDictionary+RemoveAtKeyPath.h"

@implementation NSMutableDictionary (RemoveAtKeyPath)

-(void)removeObjectAtKeyPath:(NSString *)keyPath{

    NSArray *paths=[keyPath componentsSeparatedByString:@"."];

    [[self objectForKey:paths[0]] removeObjectForKey:paths[1]];

}

@end

それは次のように呼ばれます:

NSMutableDictionary *adict=[[NSMutableDictionary alloc]initWithDictionary:@{@"key1" : @"obj1", @"key11":@"obj11"}];

NSMutableDictionary *bdict=[[NSMutableDictionary alloc]initWithDictionary:@{@"key2" : adict}];

NSLog(@"%@",bdict);
NSLog(@"%@",[bdict valueForKeyPath:@"key2.key1"]);

[bdict removeObjectAtKeyPath:@"key2.key1"];
NSLog(@"After category : %@",bdict);
于 2013-02-27T06:43:56.883 に答える