我想在目标C中询问有关NSString *的问题。我可以检查NSString *对象的最后一个字符吗?
示例:
NSString* data = @"abcde,";
if(data is end with ',') // I don't know this part
// do sth
非常感谢。
答案 0 :(得分:165)
NSString *data = @"abcde,";
if([data hasSuffix:@","]) // This returns true in this example
// do something
答案 1 :(得分:5)
如果您只想确定字符串是否包含给定模式,则可以使用谓词:
所以,在你的例子中:
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放入一个方法,我们已经添加了消息传递给它,这将偏向分析结果,除非你在分析备选方案时也这样做。
对于大多数情况来说,所有这些可能都是过早的优化 - 但是当然如果你每秒进行数千次这样的测试就很重要(在这种情况下你可能想要在循环中直接使用代码,因为在紧密的内部循环中传递的消息不是一个很好的计划。)