3

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

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

在 Xcode 中,这只是在没有警告或错误的情况下运行,但没有做我认为应该做的事情。

4

3 回答 3

23

那不应该是

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

"==" 比较指针。isEqual: 和 isEqualToString: 比较字符串,尽管如果你知道 extension 和 WantExtension 都是 NSString (在这种情况下你这样做), isEqualToString 会更好。

实际上,如果您是像我这样的老 C++ 和 Java 程序员,您可能会更乐意将已知不为 null 的“wantedextension”放在第一位。在 Objective C 中,这不是必需的,因为“发送消息”(即调用方法)到 nil 返回 0 或 false。

if ([wantedExtension isEqualToString:extension]) {
   ...
}
于 2009-01-27T18:59:06.093 回答
9

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

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

如果 extension 是nil,结果将为 false ,即使 WantExtension 是 non- nil,因为nilObjective-C 中的消息传递对于BOOL返回值函数返回 0 。

于 2009-01-27T20:44:08.813 回答
2

请记住,在 Objective-C 中没有运算符重载。在这种情况下,==它所做的是一个完全合法且被广泛使用的用法,比较两个指针。你有两个指针,它们总是指向两个不同的对象,所以==操作符总是为假的。

于 2009-01-28T02:54:04.120 回答