Цель C: равенство == и строгое равенство ===

Мне, как программисту Javascript, вбивали в голову использовать === вместо == везде, где это возможно.

Когда я изучаю Objective C, даже в официальной документации я вижу только использование ==.

Мой вопрос в том, должен ли я продолжать использовать строгое равенство в моем коде на Objective C? Так ли это необходимо, как с Javascript? Я бы предположил, что строгое равенство дает небольшое повышение производительности, но в Objective C это повышение слишком незначительно, чтобы иметь большое значение?


person Jimmery    schedule 15.05.2013    source источник
comment
см. это. 2293859/ и stackoverflow.com/questions/8020776/   -  person DharaParekh    schedule 15.05.2013
comment
Причина, по которой вы используете === в Javascript, заключается только в том, что его оператор == невероятно сломан. Оператор == в Objective-C не сломан, но он почти наверняка не делает то, что вы хотите, по крайней мере, для объектов. Два из приведенных ниже ответов объясняют, почему и что вы должны делать.   -  person JeremyP    schedule 15.05.2013


Ответы (4)


Это очень просто, в Objective C у вас нет оператора ===.

Обычно вы не используете == для сравнения объектов, потому что он сравнивает значения указателя, а не значение объектов. Итак, если вы хотите, например, сравнить две строки, вы должны использовать:

[stringObject isEqual:@"the string"];

Это сравнивает строковое значение, а не указатели. Однако есть веские причины использовать оператор == для сравнения объектов. Многие обратные вызовы делегата имеют объект-отправитель в качестве параметра. Например, если вы реализуете несколько представлений таблиц с одним контроллером, вы хотите проверить, какое представление таблиц вызывает ваш метод:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  if (tableView == self.firstTableView) {
     ...
  }

   if (tableView == self.secondTableView) {
     ...
  }
...
}
person Marcel    schedule 15.05.2013

Оператор строгого равенства (===) существует в JS, потому что обычный оператор равенства (==) выполняет неявное преобразование типа, если вы сравниваете два разных типа данных. Один из аргументов будет преобразован для соответствия другому на основе набора неинтуитивных правил. Например, 1 == TRUE даст вам «true», даже если 1 — это число, а TRUE — логическое значение. Кто-нибудь знает, выполняет ли Objective-C такие неявные преобразования типов?

person stefvhuynh    schedule 01.10.2013

AFAIK нет эквивалента === в Objective-C.

Вы можете сравнить int с float, используя ==, что не очень хорошая идея по другим причинам. Когда вы сравниваете два идентификатора (например, UIView* и UIButton*) с ==, вы сравниваете значения указателя. Если это ИСТИНА/ДА, то это идентичный, а не просто равный объект. Это тот самый экземпляр.

При сравнении объектов на равенство их значений гораздо лучше использовать метод isEqual:. Возможно, вам придется перезаписать isEqual в ваших собственных подклассах, чтобы правильно использовать его с вашим собственным объектом.

Думаю, если бы у вас была конкретная проблема/пример, мы могли бы объяснить ее лучше.

person Hermann Klecker    schedule 15.05.2013

Такой оператор, как ===, не существует в Objective C.

И в основном есть одно общее правило, если вы хотите сравнить два объекта: используйте isEqual: и не используйте == для объектов. Если только вы не уверены в том, что делаете.

Вот неплохая ссылка для получения более глубоких знаний: Сравнение объектов

person Vytautas    schedule 15.05.2013