NSString: isEqual vs. isEqualToString

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

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

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

Расширяясь в ответах @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");
}

Ответ 5

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

  • Тип безопасности
  • Как nil обрабатывается