我有一个看起来像这样的NSDictonary。我需要获取与特定名称关联的所有键值。例如,名称Samrin与键11.titleKey,110.titleKey等相关联。我遇到的问题是我不知道如何才能到达数组中的对象然后将它们传递回键值?
我尝试了以下代码并没有取得多大成功。
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *stringsPlistPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"birthdays.plist"];
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:stringsPlistPath];
NSArray *temp = [dictionary allKeysForObject:@"Samrin Ateequi"];
NSLog(@"temp: %@ ...", temp);
OUTPUT:
temp: (
) ...
答案 0 :(得分:1)
我认为您可以使用keysOfEntriesPassingTest
。类似的东西:
NSSet *keysSet = [dictionary keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop) {
if ([[obj objectAtIndex:0] isEqualToString:@"Samrin Ateequi"]) {
return YES;
} else {
return NO;
}
}];
答案 1 :(得分:0)
allKeysForObject:
使用isEqual:
在字典中查找与该对象相等的值。您对该字典的值是NSArrays,因此它永远不会与您要查找的NSString匹配。
如果您不更改数据结构,则必须遍历所有内容以获得所需的结果。
如果您愿意使用SQL存储升级到Core Data,那么您的结果将会很快,并且代码将比循环遍历字典更容易。这是Core Data要解决的问题。您可以开始使用Core Data Programming Guide。
答案 2 :(得分:0)
希望这会对你有所帮助:我举了一个例子。
NSDictionary *dict = @{@"key1":@[@"mania",@"champ"],
@"key2":@[@"mann",@"champ"],
@"key3":@[@"mania",@"champ",@"temp"]};
NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"ANY SELF=%@",@"mania"];
NSArray *allValues = [dict allValues];
NSArray *requiredRows = [allValues filteredArrayUsingPredicate:filterPredicate];
NSMutableArray *requiredKeyArray = [[NSMutableArray alloc]initWithCapacity:0];
for (id anObj in requiredRows) {
[requiredKeyArray addObject:[dict allKeysForObject:anObj]];
}
NSLog(@"Desc: %@",[requiredKeyArray description]);