Почему мое сравнение, если утверждение не работает?
Почему следующий код (в какао) не работает?
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 нет перегрузки операторов. Что за ==
делает в этом случае совершенно законное и широко используемое использование, сравнивая два указателя. У вас есть два указателя, которые всегда будут указывать на два разных объекта, поэтому ==
Оператор всегда будет ложным.