2010-07-14 77 views
57

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

例子:

NSString* data = @"abcde,"; 

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

非常感谢你。

回答

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

robinjam,谢谢你的回复。我尝试了一下,但没有奏效。这是另一种方法吗? – Questions 2010-07-14 10:12:56

+1

它适用于我...您必须在其他地方有一个错误。 – robinjam 2010-07-14 10:16:12

+0

robinjam,谢谢你的回复。我尝试另一个NSString *,它也可以。我想这是我的程序的一些其他问题。因为NSString *是从其他对象传入的,所以我可以显示NSString的最后一个字符,因为我想确认最后一个字符。谢谢。 – Questions 2010-07-15 01:07:47

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

编辑

我已经做了一些分析,这是矫枉过正在这个简单的情况下(见下文我的意见)。无论如何,我将把答案留在这里,只是作为使用谓词来处理这类事情的一个例子。

+6

哇!谓词评估只是为了检查字符串的后缀?这有点矫枉过正。 – dreamlax 2010-07-14 14:02:29

+0

为什么它是矫枉过正? '-hasSuffix:'只是一个设置NSString搜索的便捷方法。仅仅因为它写得更短,并不能提高效率。这也是来自文档的建议(正如我链接到的),它还为提问者提供了另一个测试他的代码的方法,因为'-hasSuffix:'方法不起作用,并且引入了一种新的方法来进行字符串搜索,提问者和其他人可能以前没有考虑过。 – Abizern 2010-07-14 14:16:44

+1

它是过度的,因为您必须创建一个谓词对象,该对象必须解析谓词格式字符串,并且还必须使用目标对象评估谓词对象。 'hasSuffix:'只需确保接收者的最后一个字符与参数相等。如果谓词'endswith'在内部只使用'hasSuffix:',那就不会让我感到惊讶。另外,在另一个答案中为'hasSuffix:'提供的代码有效。如果它不适用于OP,那么他没有给我们足够的信息来正确回答他的问题。 – dreamlax 2010-07-14 14:21:08

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放入方法中,我们已经将消息传递给它,但这会歪曲分析结果,除非在分析替代方案时执行相同操作。

所有这些在大多数情况下可能是不成熟的优化 - 但是当然,如​​果你每秒钟做数千次测试,这可能很重要(在这种情况下,你可能想直接在循环中使用代码,因为消息在严密的内部循环中传递并不是一个很好的计划)。

+0

' - [NSString characterAtIndex:]'返回一个'unichar',而不是'char'。 – 2010-07-16 11:40:46

+0

好点乔纳森 - 我已经更新了相应的例子... – 2010-07-16 16:50:11

相关问题