我是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
。
答案 0 :(得分:1)
所以我终于想出了这个东西,所以想与其他人分享,以备将来参考。我相信将来会有一些其他失去的灵魂寻找类似的东西(或者至少我希望:))。
我编写代码的方式是:
为第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
函数比较集合。