Проверка равенства в Objective-C

Как проверить ключ в словаре так же, как строка в параметре метода? i.e в нижнем коде, dictobj - это объект NSMutableDictionary, и для каждого ключа в dictobj мне нужно сравнить со строкой. Как достичь этого? Должен ли я указывать ключ для NSString?

-(void)CheckKeyWithString:(NSString *)string
{
   //foreach key in NSMutableDictionary
   for(id key in dictobj)
     {
       //Check if key is equal to string
       if(key == string)// this is wrong since key is of type id and string is of NSString,Control doesn't come into this line
          {
           //do some operation
          }
     }
}

Ответы

Ответ 1

Когда вы используете оператор ==, вы сравниваете значения указателя. Это будет работать только тогда, когда объекты, которые вы сравниваете, являются точно таким же объектом, по одному и тому же адресу памяти. Например, этот код вернет These objects are different, потому что, хотя строки одинаковы, они хранятся в разных местах в памяти:

NSString* foo = @"Foo";
NSString* bar = [NSString stringWithFormat:@"%@",foo];
if(foo == bar)
    NSLog(@"These objects are the same");
else
    NSLog(@"These objects are different");

При сравнении строк вы обычно хотите сравнить текстовое содержимое строк, а не их указатели, поэтому вы должны -isEqualToString: метод NSString. Этот код вернет These strings are the same, потому что он сравнивает значение строковых объектов, а не их значений указателя:

NSString* foo = @"Foo";
NSString* bar = [NSString stringWithFormat:@"%@",foo];
if([foo isEqualToString:bar])
    NSLog(@"These strings are the same");
else
    NSLog(@"These string are different");

Чтобы сравнить произвольные объекты Objective-C, вы должны использовать более общий isEqual: метод NSObject. -isEqualToString: - оптимизированная версия -isEqual:, которую вы должны использовать, когда знаете, что оба объекта являются объектами NSString.

- (void)CheckKeyWithString:(NSString *)string
{
   //foreach key in NSMutableDictionary
   for(id key in dictobj)
     {
       //Check if key is equal to string
       if([key isEqual:string])
          {
           //do some operation
          }
     }
}