如何检查NSString的最后一个字符

时间:2010-07-14 09:48:58

标签: objective-c cocoa nsstring

我想在目标C中询问有关NSString *的问题。我可以检查NSString *对象的最后一个字符吗?

示例:

NSString* data = @"abcde,";

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

非常感谢。

3 个答案:

答案 0 :(得分:165)

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

答案 1 :(得分:5)

NSString Programming Guide建议:

  

如果您只想确定字符串是否包含给定模式,则可以使用谓词:

所以,在你的例子中:

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的链接。

修改

我已经完成了一些分析,在这个简单的案例中它有点矫枉过正(请参阅下面的评论)。无论如何,我都会在这里留下答案,就像在这类事情中使用谓词一样。

答案 2 :(得分:4)

如果您担心性能,并且想要检查一个字符,则使用-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放入一个方法,我们已经添加了消息传递给它,这将偏向分析结果,除非你在分析备选方案时也这样做。

对于大多数情况来说,所有这些可能都是过早的优化 - 但是当然如果你每秒进行数千次这样的测试就很重要(在这种情况下你可能想要在循环中直接使用代码,因为在紧密的内部循环中传递的消息不是一个很好的计划。)