iphone - 我需要将两个 NSArray/NSDictionaries 组合在一起

标签 iphone objective-c cocoa nsarray nsdictionary

我有两个 plist 文件,用作数据源,在我的应用中创建 NSArrayNSDictionaries

我希望 CSV 文件的输出如下所示:

exerciseName, muscleGroup, description
Barbell Curl, Biceps, This is a bicep exercise

问题是,我需要首先组合我拥有的两个 NSDictionaries。一个有exerciseName 和muscleName,而另一个有exerciseDescription。但我需要为每个具有所有 3 个键的练习对象准备一组字典。

我使用以下代码来构建主 NSMutableArray

if (muscleArray == nil)
    {
        NSString *path = [[NSBundle mainBundle]pathForResource:@"data" ofType:@"plist"];
        NSMutableArray *rootLevel = [[NSMutableArray alloc]initWithContentsOfFile:path];
        self.muscleArray = rootLevel;
    }

    NSMutableArray *arrayForSearching = [NSMutableArray array];
    for (NSDictionary *muscleDict in self.muscleArray)
        for (NSDictionary *excerciseDict in [muscleDict objectForKey:@"exercises"])
            [arrayForSearching addObject:[NSDictionary dictionaryWithObjectsAndKeys:
                                          [excerciseDict objectForKey:@"exerciseName"], @"exerciseName",
                                          [muscleDict objectForKey:@"muscleName"], @"muscleName", nil]];
    self.exerciseArray = arrayForSearching;

我使用以下代码来构建具有exerciseDescription 键的 NSDictionary

    NSString *exerciseNameString =self.exerciseName;
    NSString *path = [[NSBundle mainBundle] pathForResource:@"ExerciseDescriptions" ofType:@"plist"];

    NSDictionary *exerciseDescription = [NSDictionary dictionaryWithContentsOfFile:path];
    NSString *description = [exerciseDescription objectForKey:exerciseNameString];

最佳答案

您显然知道如何迭代和创建字典,那么问题是什么?

遍历exerciseArray并向其每个字典添加练习描述。然而,这似乎效率极低,您可能应该重新考虑整个事情。为什么不以随时可用的格式将它们存储在磁盘上?

当项目的顺序很重要时使用数组。在这里似乎并不重要,那么为什么不将它们保留为 NSDictionaries 呢?如果您需要访问字典中的所有键,只需调用 allKeys

编辑:像这样吗?

NSString *path = [[NSBundle mainBundle] pathForResource:@"ExerciseDescriptions"
    ofType:@"plist"];
NSDictionary *descriptions = [NSDictionary dictionaryWithContentsOfFile:path];

NSMutableArray *exercises = self.exerciseArray;
for (NSInteger i = 0; i < [exercises count]; i++) {

    NSMutableDictionary *dict = [[exercises objectAtIndex:i] mutableCopy];
    NSString *name = [dict valueForKey:@"exerciseName"];
    NSString *desc = [descriptions valueForKey:name];

    if (desc) {
        [dict setValue:desc forKey:@"exerciseDescription"];
        [exercises replaceObjectAtIndex:i withObject:dict];
    }
    [dict release];
}

关于iphone - 我需要将两个 NSArray/NSDictionaries 组合在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8442221/

相关文章:

cocoa - 如何像finder中那样制作底部边框?

swift - cocoa 自定义控件不可见

javascript - 当某个事件触发时,Javascript 可以在 iOS 中调用任何东西吗?

ios - 当我希望一个对象与 if 语句一起出现时,当我满足其要求时,它不起作用。 swift 、ARKit

iphone - 如何创建一个 UIViewController,其中包含两个 View ,根据单击的按钮显示一个或另一个

iphone - 内存使用随着 CTFontCreateWithName 和 CTFramesetterRef 的增加而增长

ios - 更新多级 plist objective-c

cocoa - Cocoa 中的 MVC 模式和模型对象初始化

iphone - Xcode 有没有办法警告新的 API 调用?

ios - 单元测试本地通知