В чем разница между isEqual: и isEqualToString:?
Почему классы добавляют методы isEqualTo * (isEqualToArray для NSArray, isEqualToData для NSData,...) вместо того, чтобы просто переопределять isEqual:?
В чем разница между isEqual: и isEqualToString:?
Почему классы добавляют методы isEqualTo * (isEqualToArray для NSArray, isEqualToData для NSData,...) вместо того, чтобы просто переопределять isEqual:?
isEqual: сравнивает строку с объектом и возвращает NO, если объект не является строкой. isEqualToString: быстрее, если вы знаете, что оба объекта являются строками, а documentation:
Особые соображения
Когда вы знаете, что оба объекта являются строками, этот метод является более быстрым способом проверки равенства, чем
isEqual:.
isEqualTo<Class> используется для обеспечения конкретных проверок равенства. Например; isEqualToArray: проверяет, что массивы содержат равное количество объектов и что объекты в данном индексе возвращают YES для isEqual: тест.
Кроме того, для написания собственных методов -isEqual: и -isEqualTo<Class>: соглашение должно допускать аргументы nil для -isEqual: и создавать исключение для аргументов nil для -isEqualTo<Class>:
Моя догадка заключается в том, что он обеспечивает небольшое повышение производительности, как isEqualToString: не нужно будет вводить-проверять, что прошло.
Расширяясь в ответах @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");
}
Я очень рекомендую это. Преимущества производительности isEqualToString в большинстве случаев незначительны. Но есть два других различия, которые упоминает автор:
nil обрабатывается