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
обрабатывается