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