次のコード (ココア) が機能しないのはなぜですか?
NSString *extension = [fileName pathExtension];
NSString *wantedExtension = @"mp3";
if(extension == wantedExtension){
//work
}
Xcodeでは、これは警告やエラーなしで実行されますが、すべきだと思うことはしません。
次のコード (ココア) が機能しないのはなぜですか?
NSString *extension = [fileName pathExtension];
NSString *wantedExtension = @"mp3";
if(extension == wantedExtension){
//work
}
Xcodeでは、これは警告やエラーなしで実行されますが、すべきだと思うことはしません。
そんなはずないでしょ
if ([extension isEqualToString:wantedExtension]) {
...
}
「==」はポインターを比較します。isEqual: と isEqualToString: は文字列を比較しますが、extension と wantedExtension の両方が NSString であることがわかっている場合は isEqualToString の方が優れています (この場合はそうします)。
実際、私のような古い C++ および Java プログラマーである場合は、null ではないことがわかっている "wantedextension" を最初に配置した方がよいかもしれません。Objective C では、nil に「メッセージを送信する」(つまり、メソッドを呼び出す) と 0 または false が返されるため、これは必要ありません。
if ([wantedExtension isEqualToString:extension]) {
...
}
Paul の答えは技術的には正しいですが、NSString のドキュメントに記載されているように、「両方のオブジェクトが文字列であることがわかっている場合、このメソッド [isEqualToString:] は isEqual: よりも高速に等価性をチェックできます。」したがって、サンプルコードの場合、正しいテストは
if([extension isEqualToString:wantedExtension]) {
...
}
拡張機能が の場合、目的の C のメッセージングは戻り値関数に対して 0 を返すためnil
、wantExtension が非であっても、結果は false になります。nil
nil
BOOL
Objective-C では、演算子のオーバーロードがないことに注意してください。この場合、==
が行っていることは、2 つのポインターを比較するという、完全に合法的でよく使用される使用法です。常に 2 つの異なるオブジェクトを指す 2 つのポインターがあるため、==
演算子は常に false になります。