Почему мое сравнение, если утверждение не работает?

Почему следующий код (в какао) не работает?

NSString *extension = [fileName pathExtension];
NSString *wantedExtension = @"mp3";
if(extension == wantedExtension){
//work
}

в XCode это просто работает без предупреждений или ошибок, но не делает то, что, я думаю, ДОЛЖНО делать.

3 ответа

Решение

Разве это не должно быть

if ([extension isEqualToString:wantedExtension]) {
...
}

"==" сравнивает указатели. isEqual: и isEqualToString: сравнить строки, хотя isEqualToString лучше, если вы знаете, что extension и wantedExtension являются NSString (что вы и делаете в этом случае).

На самом деле, если вы такой же старый программист на C++ и Java, как я, вам, возможно, будет лучше, если вы сначала выберете того, который, как известно, не имеет значения null, "wantedextension". В Objective C это не является необходимым, потому что "отправка сообщения" (т. Е. Вызов метода) в ноль возвращает 0 или false.

if ([wantedExtension isEqualToString:extension]) {
   ...
}

Технически правильный ответ Пола, но, как указано в документации NSString: "Когда вы знаете, что оба объекта являются строками, этот метод [isEqualToString:] является более быстрым способом проверки равенства, чем isEqual:". Таким образом, для вашего примера кода правильный тест

if([extension isEqualToString:wantedExtension]) {
    ...
}

Если расширение nilрезультат будет ложным, даже если требуемыйnil, с сообщениями nil в Objective-C возвращает 0 для BOOL возвращаемые функции.

Помните, что в Objective-C нет перегрузки операторов. Что за == делает в этом случае совершенно законное и широко используемое использование, сравнивая два указателя. У вас есть два указателя, которые всегда будут указывать на два разных объекта, поэтому == Оператор всегда будет ложным.

Другие вопросы по тегам