Objective-C:如何比较2个PLists

时间:2012-10-26 09:10:41

标签: objective-c nsdictionary

我是Objective-C的新手,我们的任务是分配相同应用程序的2个版本,用于Info.plist和Defaults.plist中的差异。

我已经能够找出从应用程序包中读取PLists的步骤,但是很难弄清楚如何将PLIST中的每个键与其对应文件进行比较。为了说明我是否需要比较2个应用程序包之间的Info.plist(比如build_100和build_101),我如何递归转到build_100中的每个键并比较build_101中的相同键以验证它们是否相同。

如果两个PLists都相同,那么很容易,因为isEqualToDictionary将返回TRUE,但如果嵌套字典中的某些内容在两个构建之间不同,则会出现问题。

在这里查看相关查询,我清楚地知道答案是我编写了一个遍历两个PLists的递归方法,但我真的很难以找到一种方法来为嵌套字典这样做Info.plist

2 个答案:

答案 0 :(得分:1)

所以我终于想出了这个东西,所以想与其他人分享,以备将来参考。我相信将来会有一些其他失去的灵魂寻找类似的东西(或者至少我希望:))。

我编写代码的方式是:

  1. 阅读NSDictionaries中的两个Plists
  2. 将一个Plist视为“待测试”,将另一个Plist视为参考(以进行比较),以确定其是否为“通过/失败”
  3. 遍历“待测试”Plist中的所有键,并在“参考”Plist中比较每一项。
  4. 当比较一个数组或字典时,这个检查(这是我正在努力的部分)必须是一个递归检查
  5. 为第1,2,3步写的代码很简单,所以我将给出我为#4写的方法,这是我原来问题的关键。

    此函数compareSourceObject()将采用3个参数:

    • sourceObject:要测试的对象
    • targetObject:要与
    • 进行比较的对象
    • trailPath:将保存已失败的密钥的完整路径的字符串
    - (void)compareSourceObject:(id)sourceObject andTargetObject:(id)targetObject withBreadcrumbTrail:(NSString *)trailPath{
        NSString *message = [[NSString alloc] init];
    
        if ([sourceObject isKindOfClass:[NSDictionary class]]){
            for(id item in sourceObject){
                [self compareSourceObject:[sourceObject objectForKey:item] andTargetObject:[targetObject objectForKey:item] withBreadcrumbTrail:[trailPath stringByAppendingFormat:@"->%@", item]];
            }
        }
        else if ([sourceObject isKindOfClass:[NSArray class]]){
            for (int counter=0; counter %d", counter]];
            }
        }
        else if(![sourceObject isEqual:targetObject]){
            NSLog(@"Values do not match. Value in \"TestedDicationary\" is (%@) but the reference dict has (%@)", targetObject, sourceObject);
        }
    }
    

    希望这会有所帮助。评论/建议/优化非常受欢迎。

答案 1 :(得分:0)

取一个plist,并将属性解释为字符串值的集合(NSSet),例如

:items:0:assets array

:items:0:assets:0:kind string VALUE

注意我使用/usr/libexec/PlistBuddy格式来描述属性 - path type [value]

然后对第二个plist执行相同操作,并使用NSSet函数比较集合。