Cómo comprobar el último char de una NSString


Quiero hacer una pregunta sobre la NSString * en objective C. ¿Puedo comprobar el último carácter de un objeto NSString*?

Ejemplo:

NSString* data = @"abcde,";

if(data is end with ',') // I don't know this part
  // do sth

Muchas Gracias.

Author: Abizern, 2010-07-14

3 answers

NSString *data = @"abcde,";
if([data hasSuffix:@","]) // This returns true in this example
    // do something
 164
Author: robinjam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-08 17:53:54

La Guía de Programación NSString recomienda:

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

Así que, en tu 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 auxiliar.

Aquí hay un enlace a la NSPredicate docs.

Editar

He hecho algunos perfiles y es exceso en este simple caso (ver mi comentario a continuación). Voy a dejar la respuesta aquí de todos modos sólo como un ejemplo de uso de predicados para este tipo de cosas.

 5
Author: Abizern,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-16 04:36:46

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

También puede usar categorías para agregar un método a NSString como este:

@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','])
{

}

Usted debe perfil, por supuesto, para estar seguro. Sin embargo, tenga en cuenta que al poner endsWithCharacter en un método que hemos agregado el mensaje que pasa por encima de ella, lo que sesgará los resultados 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 está haciendo esta prueba miles de veces por segundo, puede importar (en ese caso, probablemente desee usar el código directamente en el bucle, ya que el mensaje que pasa dentro de un bucle interno apretado no es un gran plan).

 4
Author: Sam Deane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-16 16:49:49