階層化された NSMutableDictionary オブジェクトがあり、階層のより深い階層にある辞書を削除できるようにしたいと考えています。removeObjectAtKeyPath のようなメソッドなど、これをすばやく簡単に行う方法はありますか? 見つからないようです。
ありがとう!
階層化された NSMutableDictionary オブジェクトがあり、階層のより深い階層にある辞書を削除できるようにしたいと考えています。removeObjectAtKeyPath のようなメソッドなど、これをすばやく簡単に行う方法はありますか? 見つからないようです。
ありがとう!
何も組み込まれていませんが、基本的なカテゴリメソッドは問題なく機能します。
@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
カテゴリを作成できます:
これは最大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);