Как проверить последний символ NSString - PullRequest
60 голосов
/ 14 июля 2010

Я хочу задать вопрос о NSString * в задаче C. Можно ли проверить последний символ объекта NSString *?

Пример:

NSString* data = @"abcde,";

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

Большое спасибо.

Ответы [ 3 ]

165 голосов
/ 14 июля 2010
NSString *data = @"abcde,";
if([data hasSuffix:@","]) // This returns true in this example
    // do something
5 голосов
/ 14 июля 2010

Руководство по программированию NSString рекомендует:

Если вы просто хотите определить, содержит ли строка заданный шаблон, вы можете использовать предикат:

Итак, в вашем примере:

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
}

Долго ли не писать?Возможно, но если вы сделаете это более чем в одном месте, его можно легко преобразовать в вспомогательный метод.

Вот ссылка на документы NSPredicate .

Edit

Я провел некоторое профилирование, и в этом простом случае это излишне (см. Мой комментарий ниже).В любом случае, я оставлю здесь ответ, просто как пример использования предикатов для такого рода вещей.

4 голосов
/ 16 июля 2010

Если вы беспокоитесь о производительности и хотите проверить наличие одного символа, использование -characterAtIndex: метод вполне может быть быстрее. -hasSuffix: принимает строку, поэтому потенциально требуется выполнить больше работы, чем просто проверка одного символа (хотя разница может быть тривиальной).

Вы также можете использовать категории, чтобы добавить метод к NSString следующим образом:

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

}

Вы должны профиль, конечно, чтобы быть уверенным. Имейте в виду, однако, что, поместив конец метода с методомWithCharacter в метод, мы добавили к нему передаваемую служебную информацию, которая искажает результаты профилирования, если вы не сделаете то же самое при профилировании альтернатив.

Все это, вероятно, является преждевременной оптимизацией в большинстве случаев, но, конечно, если вы выполняете этот тест тысячи раз в секунду, это может иметь значение (в этом случае вы, вероятно, захотите использовать код непосредственно в цикле, так как передача сообщений внутри тесного внутреннего цикла не очень хороший план).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...