objective-c cocoa string object-comparison

objective c - ¿Por qué mi afirmación de comparar no funciona?



objective-c cocoa (3)

La respuesta de Paul es técnicamente correcta, pero como se indica en la documentación de NSString, "Cuando sabes que ambos objetos son cadenas, este método [isEqualToString:] es una forma más rápida de verificar la igualdad que isEqual:". Por lo tanto, para su código de ejemplo, la prueba correcta es

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

Si la extensión es nil , el resultado será falso, incluso si la Extensión deseada no es nil , ya que la mensajería nil en Objective-C devuelve 0 para las funciones de valor de retorno de BOOL .

¿Por qué el siguiente código (en cacao) no funciona?

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

en Xcode esto solo se ejecuta sin advertencias o errores, pero no hace lo que creo que DEBERÍA hacer.


¿No debería ser eso?

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

"==" compara los punteros. isEqual: e isEqualToString: compare las cadenas, aunque isEqualToString es mejor si sabe que tanto la extensión como wantedExtension son NSString (lo que usted hace en este caso).

En realidad, si eres un programador antiguo de C ++ y Java como yo, podrías ser más feliz poniendo primero el que se sabe que no es nulo, "wantedextension", primero. En Objective C eso no es necesario porque "enviar un mensaje" (es decir, llamar a un método) a un nil devuelve 0 o falso.

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


Recuerde que en Objective-C no hay sobrecarga del operador. Lo que está haciendo == en este caso es un uso perfectamente legal y bien utilizado, al comparar dos punteros. Tienes dos punteros que siempre apuntan a dos objetos diferentes, por lo que el operador == siempre será falso.