帮助NSdictionary

时间:2011-09-09 10:42:51

标签: objective-c nsdictionary

我有一个NSMutableArray,其中每个项目都是NSMutableDictionary。

 NSMutableAray *services = [NSMutableArray new];

 NSMutableDictionary *dict = [NSMutableDictionary dictionary];
 [dict setObject: aNetService forKey: @"net_service"];
 [dict setObject: [aNetService name] forKey: @"net_service_name"];

 [self.services addObject:dict];

然后我想根据“net_service_name”键检索一个项目。所以,我尝试了以下内容:

 -(void)netServiceBrowser:(NSNetServiceBrowser *)aBrowser didRemoveService:(NSNetService *)aNetService moreComing:(BOOL)more {

 NSLog(@"netservname%@",[aNetService name]);

 for (int i = 0; i < [services count]; i++)
 {

     NSDictionary *dict = [services objectAtIndex:i];
     NSLog(@"netservname%@",[dict objectForKey:@"net_service_name"]);

     if ([NSString stringWithFormat:@"%@",[dict objectForKey:@"net_service_name"]] == [NSString stringWithFormat:@"%@",[aNetService name]]){
         NSLog(@"Match");
     }
  }
}

在控制台中,NSLog(@“netservname”)都是相同的,但我没有收到“匹配”消息。谁能明白为什么?非常感谢!

6 个答案:

答案 0 :(得分:2)

尝试使用

if ([[dict objectForKey:@"net_service_name"] isEqualToString:[aNetService name]])

==检查身份,即两个对象是否指向相同的内存地址。 isEqualToString检查是否相等,在这种情况下,两个字符串是相同顺序的相同字符。

答案 1 :(得分:2)

[[dict objectForKey:@"net_service_name"] isEqualToString:[aNetService name]]

试试。

答案 2 :(得分:2)

试试这个:

[[NSString stringWithFormat:@"%@",[dict objectForKey:@"net_service_name"]] isEqualToString:[NSString stringWithFormat:@"%@",[aNetService name]]]  

[[dict objectForKey:@"net_service_name"] isEqualToString:[aNetService name]]

NSString isEqualToString:(NSString*) http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html

请参阅:Case-insensitive NSString comparison

答案 3 :(得分:2)

因为Objective-C使用指针来处理所有内容,所以无法直接将字符串与==运算符进行比较。你在寻找的是:

[string isEqualToString: otherString]

答案 4 :(得分:2)

始终使用isEqualToString:进行NSString比较。

(一般情况下,始终使用isEqual:及其变体进行NSObject比较)

NSObject*NSString*是指针,因此==执行指针比较,只有当指针指向内存中完全相同的地址时才是真的,这是绝对的在这种情况下,isEqualToString:检查字符串的内容是否相同。


此外,你应该更喜欢你的for循环的快速枚举形式,并避免做像stringWithFormat:@"%@"这样完全没用的东西(你正在使用只包含......另一个字符串的格式创建一个字符串。为什么你不直接使用字符串本身吗?)

// NSFastEnumeration for to loop thru a NSArray
for (NSDictionary *dict in services)
{
  NSLog(@"netservname%@",[dict objectForKey:@"net_service_name"]);

  // Loose the [NSString stringWithFormat:@"%@",...] stuff!!
  if ([[dict objectForKey:@"net_service_name"] isEqualToString:[aNetService name]]) {
     NSLog(@"Match");
  }
}

答案 5 :(得分:0)

尝试用这个替换if语句:

if ([[dict objectForKey:@"net_service_name"] compare:[aNetService name]] == NSOrderedSame)  {
    NSLog(@"Match");
}