NSString: isEqual vs. isEqualToString


94

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

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

Ответы:


103

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

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

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

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


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: не нужно будет проверять, что передается.


Ваше предположение, вероятно, верно :)
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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.