2010-08-19 63 views
1

我有一个NSArray包含几个NSDictionaries。嵌套NSArray/NSDictionary问题

我有一个NSString包含一个ID字符串。

我想要做的是遍历NSDictionaries,直到找到匹配NSString的对象。然后我想返回整个NSDictionary。

我对iPhone开发相当新,所以我可能会错过一些明显的东西......在此先感谢。 :)

编辑,下面是被保存了的.plist文件:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<array> 
    <dict> 
     <key>date</key> 
     <string>2011/05/20</string> 
     <key>id</key> 
     <string>1282007740</string> 
     <key>name</key> 
     <string>Test item name</string> 
     <key>niceDate</key> 
     <string>May 20, 2011</string> 
    </dict> 
    <dict> 
     <key>date</key> 
     <string>2010/08/15</string> 
     <key>id</key> 
     <string>1282075925</string> 
     <key>name</key> 
     <string>Test. Nothing to see here.</string> 
     <key>niceDate</key> 
     <string>Aug 15, 2010</string> 
    </dict> 
</array> 
</plist> 

比方说,我的NSString是 “1282075925”。我想用匹配的id键获得字典。

+0

更多的信息。一些代码,也许?什么是字典键? – jtbandes 2010-08-19 02:38:29

+0

对不起,我用数组的表示法更新了它(以plist形式)。 – 2010-08-19 02:51:54

+0

你能举一个你要找的NSString的例子吗?具体而言,您是在寻找“关键”还是“值”。即您是在搜索“名称”还是“测试项目名称” – Akusete 2010-08-19 02:53:42

回答

3

此代码应该做你想要的东西 - 在年底,dict要么指向NSDictionary你搜索,如果没有匹配的字典,它将是nil

// (These are assumed to exist) 
NSArray *dictionaries; 
NSString *idToFind; 



NSDictionary *dict = nil; 
for (NSDictionary *aDict in dictionaries) { 
    if ([[aDict objectForKey:@"id"] isEqualToString:idToFind]) { 
     dict = aDict; 
     break; 
    } 
} 
+0

风格+1。但是,如果'id'字段的值是除NSString之外的数组或其他类型,它会抛出'selector not supported'错误吗? – Akusete 2010-08-19 03:08:29

+1

这是一个很好的观点。如果plist是由你创建和维护的,那么值得为这类问题进行防御性编码的努力值得商榷。当涉及到静态plist数据时,我通常不会在那里放置这些防御性检查,因为我更喜欢简洁(或更重要的点,可读)代码。如果我与其他编码人员一起工作,或者plist可能由其他人编辑,我通常会这样做。这是一个判断呼吁。 – 2010-08-19 03:29:36

+0

我并不担心它是NSString以外的类型。我试过你的解决方案,因为它特别简单和优雅。不幸的是,出于某种原因,它不会将字符串匹配到字典。我把一些NSLogs调试,但我似乎无法弄清楚它出错的地方。我插入的值应该匹配,并且创建plist的例程插入一个NSString,所以它不是类型问题... – 2010-08-19 03:52:52

2

如果您正在寻找@“12345”,具有一键@“ID”

for (NSDictionary* dictionary in array1) { 
    id value = [dictionary valueForKey:@"id"]; 
    if ([value isKindOfClass:[NSString class]]) { 
     NSString* string = (NSString*) value; 
     if ([string isEqualToString:@"12345"]) { 
      return dictionary; 
     } 
    } 
} 
return nil;