【问题标题】:help with NSdictionary帮助使用 NSDictionary
【发布时间】:2011-09-09 10:42:50
【问题描述】:

我有一个 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") 都是相同的,但我没有收到“匹配”消息。谁能明白为什么?非常感谢!

【问题讨论】:

标签: objective-c nsdictionary


【解决方案1】:

尝试使用

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

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

【讨论】:

    【解决方案2】:
    [[dict objectForKey:@"net_service_name"] isEqualToString:[aNetService name]]
    

    试试看。

    【讨论】:

      【解决方案3】:

      试试这个:

      [[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

      【讨论】:

        【解决方案4】:

        因为 Objective-C 对所有内容都使用指针,所以您无法使用 == 运算符直接比较字符串。您正在寻找的是:

        [string isEqualToString: otherString]
        

        【讨论】:

          【解决方案5】:

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

          (通常,始终使用isEqual: 及其变体进行NSObject 比较)

          NSObject*NSString* 是指针,所以 == 进行指针比较,这仅在指针指向内存中完全相同的地址时才成立,而@987654328 @检查字符串内容是否相同。


          此外,你应该更喜欢你的 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");
            }
          }
          

          【讨论】:

            【解决方案6】:

            尝试用这个替换 if 语句:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-10-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多