【发布时间】:2010-07-14 09:48:58
【问题描述】:
我想问一个关于目标 C 中的 NSString * 的问题。我可以检查 NSString * 对象的最后一个字符吗?
例子:
NSString* data = @"abcde,";
if(data is end with ',') // I don't know this part
// do sth
【问题讨论】:
标签: objective-c cocoa nsstring
我想问一个关于目标 C 中的 NSString * 的问题。我可以检查 NSString * 对象的最后一个字符吗?
例子:
NSString* data = @"abcde,";
if(data is end with ',') // I don't know this part
// do sth
【问题讨论】:
标签: objective-c cocoa nsstring
NSString *data = @"abcde,";
if([data hasSuffix:@","]) // This returns true in this example
// do something
【讨论】:
NSString *lastCharacter = [myString substringFromIndex:[myString length] - 1]; NSLog(@"%@", lastCharacter);
如果你只是想判断一个字符串是否包含给定的模式,你可以使用谓词:
所以,在你的例子中:
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的链接。
编辑
我已经做了一些分析,在这个简单的案例中它是多余的(见我下面的评论)。无论如何,我将把答案留在这里,作为对这类事情使用谓词的示例。
【讨论】:
-hasSuffix: 只是一种在 NSString 上设置搜索的便捷方法。仅仅因为它写得更短并不能使它更有效率。这也是来自文档的建议(正如我链接到的),它还为提问者提供了另一个选项来测试他的代码,因为 -hasSuffix: 方法不起作用,并引入了一种新的字符串搜索方法,提问者和其他人可能以前没有考虑过。
hasSuffix: 只需确保接收者的最后一个字符等于参数。如果谓词endswith 只是在内部使用hasSuffix:,我不会感到惊讶。此外,在另一个答案中为hasSuffix: 提供的代码有效。如果它对 OP 不起作用,那么他没有给我们足够的信息来正确回答他的问题。
-hasSuffix 慢大约 3 倍。扫描 107,000 个单词需要 36 毫秒,而 14 毫秒(所以它仍然很快)。我的立场是正确的!
如果您担心性能,并且想要检查一个字符,使用 -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 放入一个方法中,我们已经向它添加了消息传递开销,这将扭曲分析结果,除非您在分析替代方案时这样做。
在大多数情况下,所有这些都可能是过早的优化 - 但当然,如果您每秒执行数千次此测试,这可能很重要(在这种情况下,您可能希望直接在循环中使用代码,因为在紧密的内部循环中传递消息并不是一个好计划)。
【讨论】:
-[NSString characterAtIndex:] 返回 unichar,而不是 char。