3

次のコード (ココア) が機能しないのはなぜですか?

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

Xcodeでは、これは警告やエラーなしで実行されますが、すべきだと思うことはしません。

4

3 に答える 3

23

そんなはずないでしょ

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

「==」はポインターを比較します。isEqual: と isEqualToString: は文字列を比較しますが、extension と wantedExtension の両方が 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]) {
    ...
}

拡張機能が の場合、目的の C のメッセージングは​​戻り値関数に対して 0 を返すためnil、wantExtension が非であっても、結果は false になります。nilnilBOOL

于 2009-01-27T20:44:08.813 に答える
2

Objective-C では、演算子のオーバーロードがないことに注意してください。この場合、==が行っていることは、2 つのポインターを比較するという、完全に合法的でよく使用される使用法です。常に 2 つの異なるオブジェクトを指す 2 つのポインターがあるため、==演算子は常に false になります。

于 2009-01-28T02:54:04.120 に答える