помогите с NSdictionary - PullRequest
       2

помогите с NSdictionary

1 голос
/ 09 сентября 2011

У меня есть 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") одинаковы, но я не получаю сообщение "Match". Кто-нибудь может понять почему? Большое спасибо!

Ответы [ 6 ]

2 голосов
/ 09 сентября 2011

Всегда используйте 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");
  }
}
2 голосов
/ 09 сентября 2011

Поскольку Objective-C использует указатели для всего, что вы не можете напрямую сравнить строки с помощью оператора ==. То, что вы ищете:

[string isEqualToString: otherString]
2 голосов
/ 09 сентября 2011

попробуйте это:

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

см .: Сравнение строк без учета регистра * NSS2

2 голосов
/ 09 сентября 2011
[[dict objectForKey:@"net_service_name"] isEqualToString:[aNetService name]]

Попробуйте это.

2 голосов
/ 09 сентября 2011

Попробуйте использовать

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

== проверяет идентичность, то есть указывают ли два объекта на один и тот же адрес памяти. isEqualToString проверяет равенство, в этом случае, две строки - это одинаковые символы в одинаковом порядке.

0 голосов
/ 09 сентября 2011

Попробуйте заменить оператор if следующим:

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