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

问题描述 投票:61回答:3

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

示例:

NSString* data = @"abcde,";

if(data is end with ',') // I don't know this part
  // do sth
objective-c cocoa nsstring
3个回答
166
投票
NSString *data = @"abcde,";
if([data hasSuffix:@","]) // This returns true in this example
    // do something

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

编辑

我已经进行了一些分析,在这种简单情况下,它是过大的(请参阅下面的评论)。无论如何,我还是把答案留在这里,作为将谓词用于此类事情的示例。


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放入方法中,我们已将传递消息的开销添加到该方法中,否则将使概要分析结果产生偏差,除非在概要分析替代方案时执行相同的操作。

在大多数情况下,所有这些可能都是过早的优化-但是,当然,如果您每秒进行数千次此测试,则可能很重要(在这种情况下,您可能希望直接在循环中使用代码,例如消息在紧密的内部循环中传递并不是一个好计划)。

© www.soinside.com 2019 - 2024. All rights reserved.