Почему мое сравнение, если заявление не работает? - PullRequest
3 голосов
/ 27 января 2009

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

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

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

Ответы [ 3 ]

23 голосов
/ 27 января 2009

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

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

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

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

if ([wantedExtension isEqualToString:extension]) {
   ...
}
9 голосов
/ 27 января 2009

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

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

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

2 голосов
/ 28 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...