为什么我的比较if语句不起作用?

时间:2009-01-27 18:54:42

标签: objective-c cocoa string object-comparison

为什么以下代码(在可可中)不起作用?

NSString *extension = [fileName pathExtension];
NSString *wantedExtension = @"mp3";
if(extension == wantedExtension){
//work
}
在Xcode中,这只是在没有警告或错误的情况下运行,但是没有按照我认为的那样做。

3 个答案:

答案 0 :(得分:23)

不应该是

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

“==”比较指针。 isEqual:和isEqualToString:比较字符串,虽然isEqualToString更好,如果你知道extension和wantedExtension都是NSString(在这种情况下你做)。

实际上,如果你是一个像我这样的老C ++和Java程序员,你可能会更乐意把一个已知不为空的那个,“wantedextension”,首先。在Objective C中,这是不必要的,因为“发送消息”(即调用方法)为nil返回0或false。

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

答案 1 :(得分:9)

Paul的答案在技术上是正确的,但正如NSString文档中所述,“当你知道两个对象都是字符串时,这个方法[isEqualToString:]是比isEqual更快的检查相等性的方法:”因此,对于您的示例代码,正确的测试是

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

如果扩展名为nil,则结果将为false,即使wantExtension不为nil,因为Objective-C中的消息nil返回0 BOOL返回价值功能。

答案 2 :(得分:2)

请记住,在Objective-C中没有运算符重载。在这种情况下==正在做的是一个完全合法且常用的用法,比较两个指针。你有两个指针总是指向两个不同的对象,因此==运算符将始终为false。