NSString: isEqual проти isEqualToString


94

У чому різниця між isEqual:і isEqualToString:?

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

Відповіді:


103

isEqual:порівнює рядок з об'єктом і повертається, NOякщо об'єкт не є рядком. isEqualToString:швидше, якщо ви знаєте, що обидва об’єкти є рядками, як зазначено в документації :

Спеціальні міркування

Коли ви знаєте, що обидва об’єкти є рядками, цей метод є більш швидким способом перевірки рівності, ніж isEqual:.

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


3
Якщо ви вірите Аарону Хіллегасу, тоді різниці в продуктивності немає, лише трохи типу safty
Каро

2
Дякую за посилання - корисно. Хоча ви просите нас повірити Марку Далрімплу - ким я займаюся :)
Abizern

Оновлене посилання: bignerdranch.com/blog/isequal-vs-isequaltostring
Макс

16

Крім того, для написання власних методів -isEqual:і -isEqualTo<Class>:методів, дозвіл полягає в тому, щоб дозволити аргументи nil для -isEqual:та створити виняток для аргументів nil-isEqualTo<Class>:


1
Я раніше з цим не стикався, жодної документації, яку ви знаєте?
Майк Абдулла

2
Здається, це не відповідає дійсності для isEqualToString, який просто повертає НІ, якщо ви введете нуль.
Яка Янчар

9
Цікаво, що це задокументовано у розділі Порівняння об’єктів <a href=" developer.apple.com/documentation/Cocoa/Conceptual/… Основи керівництва</a>
Джонатан Данн

Це не правда. isEqualToString не викликає винятку.
respectTheCode

1
На веб-сторінці Керівництва з основ какао сказано: "Цей документ може не представляти найкращих практик сучасного розвитку". Старий, мабуть.
cbh2000

5

Я припускаю , що це забезпечує незначне підвищення продуктивності, оскільки isEqualToString: не доведеться перевіряти тип, що передано.


Ваша здогадка, мабуть, правда :)
Philip007

5

Розгортаючись на @Abizern та @Jonathan Dann відповідає, обидва 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оброблений

Я не бачу ніякої різниці в тому, як обидва обробляють нуль. Будьте нульовим - приймачем або аргументом, або тим і іншим.
SayeedHussain

Якого б "цього" вже не було: /
Джаред Грубб,

1
Дякую @JaredGrubb, я знайшов нову URL-адресу.
Ben Packard
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.