2010-07-14 20 views

Respuesta

162
NSString *data = @"abcde,"; 
if([data hasSuffix:@","]) // This returns true in this example 
    // do something 
+0

robinjam, gracias por su respuesta. Lo intento, pero no funcionó. ¿Es otro método? – Questions

+1

Funciona para mí ... Debe tener un error en otro lugar. – robinjam

+0

robinjam, gracias por su respuesta. Y pruebo otro NSString *, también funciona. Supongo que son algunos otros problemas de mi programa. Debido a que el NSString * se pasa de otro objeto, ¿puedo mostrar el último carácter de NSString porque quiero confirmar que el último carácter es? Gracias. – Questions

5

El NSString Programming Guide recomienda:

Si simplemente desea determinar si una cadena contiene un patrón determinado, puede utilizar un predicado:

Así, en su ejemplo:

NSString *data = @"abcde,"; 

// Create the predicate 
NSPredicate *myPredicate = [NSPredicate predicateWithFormat:@"SELF endswith %@", @","]; 

// Run the predicate 
// match == YES if the predicate is successful 
BOOL match = [myPredicate evaluateWithObject:data]; 

// Do what you want 
if (match) { 
    // do something 
} 

¿Un poco largo para escribir? Tal vez, pero si haces esto en más de un lugar, se puede refactorizar fácilmente en un método de ayuda.

Aquí hay un enlace al NSPredicate docs.

Editar

que he hecho algunos perfiles y es una exageración en este caso sencillo (ver mi comentario a continuación). Dejaré la respuesta aquí de todos modos solo como un ejemplo de usar predicados para este tipo de cosas.

+6

Woah! ¿Predicar la evaluación solo para verificar el sufijo de una cadena? Es un poco exagerado – dreamlax

+0

¿Por qué es exagerado? '-hasSuffix:' es solo un método conveniente para configurar una búsqueda en NSString. El hecho de que sea más corto de escribir no lo hace más eficiente.También es una recomendación de los documentos (como me vinculé) y también le da al encuestador otra opción para probar su código ya que el enfoque '-hasSuffix:' no funciona, e introduce un nuevo enfoque para la búsqueda de cadenas que el que pregunta y otros pueden no haberlo considerado anteriormente. – Abizern

+1

Es excesivo porque tiene que crear un objeto predicado, que debe analizar la cadena de formato de predicado, y también debe evaluar el objeto predicado con el objeto de destino. 'hasSuffix:' solo tiene que asegurarse de que los últimos caracteres del receptor sean iguales al argumento. No me sorprendería si el predicado 'endswith' acaba de usar' hasSuffix: 'internamente. Además, el código provisto para 'hasSuffix:' en la otra respuesta funciona. Si no está funcionando para el OP, entonces no nos ha dado suficiente información para responder correctamente a su pregunta. – dreamlax

4

Si le preocupa el rendimiento y desea comprobar si hay un carácter, el uso del método -characterAtIndex: puede ser más rápido. -hasSuffix: toma una cadena, por lo que potencialmente necesita hacer más trabajo que simplemente verificar un solo carácter (aunque la diferencia puede ser trivial).

También puede utilizar categorías para añadir un método para NSString así:

@interface NSString(StringUtilities) 
    - (BOOL) endsWithCharacter: (unichar) c; 
@end 

@implementation NSString(StringUtilities) 

    - (BOOL) endsWithCharacter: (unichar) c 
    { 
     NSUInteger length = [self length]; 
     return (length > 0) && ([self characterAtIndex: length - 1] == c); 
    } 

@end 

// test it... 
NSString *data = @"abcd,"; 
if ([data endsWithCharacter: L',']) 
{ 

} 

Debe Perfil, por supuesto, para estar seguro. Sin embargo, tenga en cuenta que al poner endsWithCharacter en un método, hemos agregado el mensaje que le pasa por encima, lo que sesgará los resultados de creación de perfiles a menos que haga lo mismo al perfilar las alternativas.

Todo esto es probablemente una optimización prematura para la mayoría de los casos, pero por supuesto si haces esta prueba miles de veces por segundo puede ser importante (en ese caso, probablemente quieras usar el código directamente en el ciclo) , ya que el mensaje que pasa dentro de un circuito interno cerrado no es un gran plan).

+0

'- [NSString characterAtIndex:]' devuelve un 'unichar', no un' char'. –

+0

Buen punto Jonathan: he actualizado el ejemplo en consecuencia ... –

Cuestiones relacionadas