【发布时间】:2015-06-15 12:07:11
【问题描述】:
我正在使用以下函数来检查数组中的对象是否存在于另一个数组中。如果对象不存在,那么我会将该对象添加到新数组中,否则该对象将不会包含在我实例化的新数组中。
+ (NSMutableArray *)loadUngroupedSpeakerList
{
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *speakerList = [[NSMutableArray alloc] init];
NSArray *speakerIDList = [userDefaults objectForKey:DATA_SPEAKER_IDLIST];
NSArray *speakerIDListGrouped = [userDefaults objectForKey:DATA_SPEAKER_IDLIST_GROUPED];
//**** this is for checking the contents of speakerIDListGrouped ****//
for(NSString *speakerID in speakerIDListGrouped)
{
NSLog(@"FLOWCHECK~ loadUngroupedSpeakerList check content:%@", speakerID);
}
for(NSString *speakerID in speakerIDList)
{
if(![speakerIDListGrouped containsObject:speakerID])
{
NSLog(@"FLOWCHECK~ loadUngroupedSpeakerList: speakerID: %@", speakerID);
NSDictionary *speakerDict = [userDefaults dictionaryForKey:[NSString stringWithFormat:@"%@%@", DATA_SPEAKER_DICT, speakerID]];
[speakerList addObject:speakerDict];
}
}
return speakerList;
}
在上面的代码中,speakerList 包含所有的speakerID。而 speakerIDListGrouped 仅包含组中使用的扬声器 ID。我的函数需要消除组中使用的所有扬声器 ID,所以我按照上面代码的方式完成了。
我的问题: 当我运行代码时,我注意到即使 speakerIDListGrouped 包含 speakerIDList 中的对象,这两行仍然会被执行
NSDictionary *speakerDict = [userDefaults dictionaryForKey:[NSString stringWithFormat:@"%@%@", DATA_SPEAKER_DICT, speakerID]];
[speakerList addObject:speakerDict];
据我了解,这不应该发生。因为我只允许在 speakerIDList 不包含该对象时执行它们。
这是我执行代码时的日志:
2015-06-15 19:31:24.849 soulbeats[1936:433953] FLOWCHECK~ loadUngroupedSpeakerList check content:72243140485836704
2015-06-15 19:31:24.850 soulbeats[1936:433953] FLOWCHECK~ loadUngroupedSpeakerList check content:7782687177520836128
2015-06-15 19:31:24.850 soulbeats[1936:433953] FLOWCHECK~ loadUngroupedSpeakerList: speakerID: 72243140485836704
2015-06-15 19:31:24.851 soulbeats[1936:433953] FLOWCHECK~ loadUngroupedSpeakerList: speakerID: 7782687177520836128
可以看出,speakerIDListGrouped 确实包含这两个对象。但是,当我尝试通过将下部 for 循环内的字符串硬编码为我在 Log 上打印的对象之一(即 72243140485836704)来替换字符串时。该函数现在可以正常工作,我的意思是它没有执行我之前显示的两行。
我现在很困惑。我硬编码的字符串和从数组中获得的字符串有什么区别?内容是一样的。
非常感谢!
【问题讨论】:
-
似乎您想知道
NSDictionary中的NSString是否存在于NSArray中,而containsObject:则不存在。您可以使用valueForKeyPath:,例如给您一个speakerID的NSArray,然后检查它是否在里面。 -
听起来你想使用
NSSet。 -
打印
speakerIDListGrouped和speakerIDList的内容,同时打印它们包含的每个对象的类 - 是否都匹配? -
嗨@Larme,嗯,不,speakerIDList 和speakerIDListGrouped 包含NSStrings。只有输出数组包含 NSDictionary。
-
@Droppy 我会试试的。谢谢!
标签: ios objective-c arrays