Я хочу задать вопрос о NSString * в объекте C. Могу ли я проверить последний char объекта NSString *?
Пример:
NSString* data = @"abcde,";
if(data is end with ',') // I don't know this part
// do sth
Большое спасибо.
Я хочу задать вопрос о NSString * в объекте C. Могу ли я проверить последний char объекта NSString *?
Пример:
NSString* data = @"abcde,";
if(data is end with ',') // I don't know this part
// do sth
Большое спасибо.
NSString *data = @"abcde,";
if([data hasSuffix:@","]) // This returns true in this example
// do something
Руководство по программированию 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 docs.
Edit
Я сделал некоторый профилирование, и это излишне в этом простом случае (см. мой комментарий ниже). В любом случае я оставлю ответ здесь как пример использования предикатов для такого рода вещей.
Если вас беспокоит производительность, и вы хотите проверить наличие одного символа, использование метода -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','])
{
}
Конечно, вы должны прокомментировать, конечно. Имейте в виду, что, добавив endWithCharacter в метод, мы добавили ему служебные данные, которые будут искажать результаты профилирования, если вы не сделаете то же самое при профилировании альтернатив.
Все это, вероятно, преждевременная оптимизация для большинства случаев - но, конечно, если вы делаете этот тест тысячи раз в секунду, это может иметь значение (в этом случае вы, вероятно, захотите использовать код непосредственно в цикле, поскольку сообщение, проходящее внутри жесткой внутренней петли, не является отличным планом).