Objective c 目标C:如何比较两个PLIST
我对Objective-C完全是新手,我的任务是比较同一应用程序的两个版本的Info.plist和Defaults.plist的差异 我已经能够理解从应用程序包中读取PLists的步骤,但是我很难理解如何将PLists中的每个键与其对应的文件进行比较。为了举例说明,如果我需要比较两个应用程序包(比如build_100和build_101)之间的Info.plist,我如何递归地转到build_100中的每个键,并比较build_101中的相同键,以验证它们是否相同 如果两个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都相同,这很
isEqualToDictionary
将返回TRUE,但如果嵌套字典中的内容在两个构建之间不同,则会出现问题
通过这里的相关查询,我很清楚,答案是我编写了一个递归方法,该方法迭代两个plist,但对于像
Info.plist
这样的嵌套字典,我真的很难找到一种方法来实现这一点,取一个plist,并将属性解释为一个集合(NSSet
)字符串值,例如
:项目:0:资产数组
:项目:0:资产:0:种类字符串值
注意:我正在使用/usr/libexec/PlistBuddy
格式来描述属性-路径类型[值]
然后对第二个plist执行同样的操作,并使用
NSSet
函数比较集合。因此我最终解决了这个问题,因此考虑与其他人共享它以供将来参考。我相信将来会有其他迷失的灵魂在寻找类似的东西(或者至少我希望:))
我编写代码的方式是:
:要测试的对象sourceObject
:要比较的对象targetObject
:保存失败密钥的整个路径的字符串trailPath
希望这能有所帮助。欢迎评论/建议/优化。@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); } }