NSString: isEqual vs. isEqualToString

94

В чем разница между isEqual:и isEqualToString:?

Почему классы добавляют методы isEqualTo * (isEqualToArray для NSArray, isEqualToData для NSData, ...) вместо простого переопределения isEqual:?

Яка Янчар
источник

Ответы:

103

isEqual:сравнивает строку с объектом и вернет, NOесли объект не является строкой. isEqualToString:будет быстрее, если вы знаете, что оба объекта являются строками, как указано в документации :

Особые соображения

Когда вы знаете, что оба объекта являются строками, этот метод является более быстрым способом проверки равенства, чем isEqual:.

isEqualTo<Class>используется для обеспечения конкретных проверок на равенство. Например; isEqualToArray:проверяет, что массивы содержат равное количество объектов и что объекты с заданным индексом возвращаются YESдля isEqual:теста.

Abizern
источник
3
Если верить Аарону Хиллегасу, то разницы в производительности нет, только немного типа safty: blog.bignerdranch.com/334-isequal-vs-isequaltostring
Caro
2
Спасибо за ссылку - полезно. Хотя вы просите нас верить Марку Дэлримплу - кому я верю :)
Abizern
Обновленная ссылка: bignerdranch.com/blog/isequal-vs-isequaltostring
Макс,
16

Кроме того, для написания ваших собственных методов -isEqual:и -isEqualTo<Class>:методов соглашение заключается в том, чтобы разрешить аргументы nil для -isEqual:и вызвать исключение для аргументов nil для-isEqualTo<Class>:

Джонатан Данн
источник
1
Я не сталкивался с этим раньше, какой-либо документации, о которой вы знаете?
Майк Абдулла
2
Это не похоже на isEqualToString, который просто возвращает NO, если вы передаете nil.
Jaka Jančar
9
Интересно, что это задокументировано в разделе «Сравнение объектов» <a href=" developer.apple.com/documentation/Cocoa/Conceptual/… Основы руководства</a>
Джонатан Данн,
Это неправда. isEqualToString не вызывает исключения.
респект TheCode
1
На веб-странице Руководства по Основам Какао говорится: «Этот документ может не отражать передовой опыт текущих разработок». Видимо старый.
cbh2000
5

Я предполагаю , что он обеспечивает небольшое повышение производительности, так как isEqualToString: не нужно будет проверять, что передается.

iKenndac
источник
Ваше предположение, вероятно, верно :)
Philip007
5

Расширение на @Abizern и Данна ответы @ Джонатан, как isEqualи isEqualToStringработа с nilценностями.

- (void)testStringEqual {
    NSString *string = nil;

    STAssertFalse([string isEqual:@"test"], @"NSString isEqual");
    STAssertFalse([string isEqualToString:@"test"], @"NSString isEqualToString");

    // Note that these both return NO
    STAssertFalse([string isEqual:nil], @"NSString isEqual");
    STAssertFalse([string isEqualToString:nil], @"NSString isEqualToString");

    string = @"test";

    STAssertTrue([string isEqual:@"test"], @"NSString isEqual");
    STAssertTrue([string isEqualToString:@"test"], @"NSString isEqualToString");

    STAssertFalse([string isEqual:nil], @"NSString isEqual");
    STAssertFalse([string isEqualToString:nil], @"NSString isEqualToString");
}
уважение
источник
4

Я очень рекомендую это . Преимущества isEqualToString в производительности для большинства приложений в основном незначительны. Но есть еще два отличия, о которых автор упоминает:

  • Безопасность типов
  • Путь nilобработан
Бен Паккард
источник
Я не вижу никакой разницы в способе обработки nil этими двумя. Не быть ни получателем, ни аргументом, ни тем и другим.
SayeedHussain
Независимо от того, что «это» больше не существует: /
Джаред Грабб
1
Спасибо @JaredGrubb, я нашел новый URL.
Ben Packard