Упомянутые выше типы могут сразу показаться основными типами данных, но на самом деле они являются типами объектов, а это означает, что они являются указателями (см. главу 3).

Следовательно, их нельзя сравнивать, используя операторы языка С для проверки на равенство, как это обычно делается с конкретными числами. Дело в том, что при сравнении типов объектов в операторах языка С, по существу, сравниваются указатели, а не содержимое экземпляров объектов, как показано в приведенном ниже примере.

NSString* si = [NSString StringWithFormat: @"%@, %0", 0"Hello", @"world"];

NSString* s2 = [NSString stringWithFormat:@"%@, %0", @"Hello", @"world"];

if (si == s2) // ложно II ...

Две символьные строки равнозначны (@"Hello, world"), но не являются одинаковыми объектами. (Этот пример намеренно усложнен, поскольку эффективное управление строковыми литералами в среде Cocoa позволяет выявить, что обе символьные строки, непосредственно инициализированные значением @"Hello, world", являются одним и тем же объектом. Это не позволяет наглядно проиллюстрировать обсуждаемый здесь вопрос.)

Проверка на равенство должна быть реализована в отдельных классах. В частности, общая проверка на равенство с помощью метода isEqual: наследуется от класса NSObject и замещается, но в некоторых классах определяются также более конкретные и эффективные проверки. Таким образом, правильная проверка на равенство должна быть произведена следующим образом:

 

if ([si isEqualToString: s2])

 

Аналогично отдельные классы должны предоставлять методы для упорядоченного сравнения. Для такого сравнения вызывается стандартный метод compare:, который возвращает одну из следующих трех констант: NSOrderedAscending (получатель меньше аргумента), NSOrderedSame (получатель равен аргументу) или NSOrderedDescending (получатель больше аргумента); см. пример 3.2.


 

 

 

Добавить комментарий