我想问一个关于目标C中NSString *的问题。我可以检查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 *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的链接。
编辑
我已经进行了一些分析,在这种简单情况下,它是过大的(请参阅下面的评论)。无论如何,我还是把答案留在这里,作为将谓词用于此类事情的示例。
[如果您担心性能,并且想要检查一个字符,则使用-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','])
{
}
当然,您应该配置文件。请记住,尽管通过将endsWithCharacter放入方法中,我们已将传递消息的开销添加到该方法中,否则将使概要分析结果产生偏差,除非在概要分析替代方案时执行相同的操作。
在大多数情况下,所有这些可能都是过早的优化-但是,当然,如果您每秒进行数千次此测试,则可能很重要(在这种情况下,您可能希望直接在循环中使用代码,例如消息在紧密的内部循环中传递并不是一个好计划)。