Objective c 目标C:如何比较两个PLIST

Objective c 目标C:如何比较两个PLIST,objective-c,nsdictionary,Objective C,Nsdictionary,我对Objective-C完全是新手,我的任务是比较同一应用程序的两个版本的Info.plist和Defaults.plist的差异 我已经能够理解从应用程序包中读取PLists的步骤,但是我很难理解如何将PLists中的每个键与其对应的文件进行比较。为了举例说明,如果我需要比较两个应用程序包(比如build_100和build_101)之间的Info.plist,我如何递归地转到build_100中的每个键,并比较build_101中的相同键,以验证它们是否相同 如果两个plist都相同,这很

我对Objective-C完全是新手,我的任务是比较同一应用程序的两个版本的Info.plist和Defaults.plist的差异

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

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


通过这里的相关查询,我很清楚,答案是我编写了一个递归方法,该方法迭代两个plist,但对于像
Info.plist
这样的嵌套字典,我真的很难找到一种方法来实现这一点,取一个plist,并将属性解释为一个集合(
NSSet
)字符串值,例如

:项目:0:资产数组

:项目:0:资产:0:种类字符串值

注意:我正在使用
/usr/libexec/PlistBuddy
格式来描述属性-
路径类型[值]


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

因此我最终解决了这个问题,因此考虑与其他人共享它以供将来参考。我相信将来会有其他迷失的灵魂在寻找类似的东西(或者至少我希望:))

我编写代码的方式是:

  • 阅读词典中的两个单词
  • 将一个Plist视为“待测试”,将另一个Plist视为参考(进行比较),以确定其是否合格/不合格
  • 在“待测试”Plist中循环所有键,并在“参考”Plist中比较每个键
  • 当比较数组或字典时,这个检查(这是我一直在努力的部分)必须是递归检查
  • 为步骤#1、2、3编写的代码非常简单,因此我将给出为#4编写的方法,这是我最初问题的关键

    此函数compareSourceObject()将接受3个参数:

    • sourceObject
      :要测试的对象
    • targetObject
      :要比较的对象
    • trailPath
      :保存失败密钥的整个路径的字符串
    -(void)将sourceObject:(id)sourceObject和targetObject:(id)targetObject与breadcrumbtrail:(NSString*)trailPath进行比较{ NSString*消息=[[NSString alloc]init]; if([sourceObject IsKindof类:[NSDictionary类]]){ 对于(sourceObject中的id项){ [自比较源对象:[sourceObject objectForKey:item]和目标对象:[targetObject ForKey:item]与breadCrumbTrail:[trailPath StringBy Appending Format:@->%@,item]]; } } else if([sourceObject isKindOfClass:[NSArray class]]){ 对于(整数计数器=0;计数器%d”,计数器]]; } } 如果(![sourceObject isEqual:targetObject]){ NSLog(@“值不匹配,\“TestedCational\”中的值为(%@),但引用dict有(%@)”、targetObject、sourceObject); } }
    希望这能有所帮助。欢迎评论/建议/优化。

    @Rahul基本上我建议将层次结构扁平化。你能详细说明一下如何做到这一点吗。我已经找到了一种方法来做我想做的事情,但我非常有兴趣寻找其他方法来做同样的事情。@Prateek:我还有一个额外的答案(及跟进问题)来自另一个似乎已经消失的使用。我想知道是不是你做了什么导致了它,因为你似乎是最后一个更新这个问题的用户。他没有。你可以点击编辑查看他的更改。@Rahul:参考这个链接@Sulthan,Prateek:我对这个网站的使用指南有点陌生,所以忽略我愚蠢的问题:)然而,我确信我已经回复了另一条评论,现在已经不见了。我不知道这是怎么发生的。 - (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); } }