【问题标题】:How to check the last char of an NSString如何检查 NSString 的最后一个字符
【发布时间】: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


    【解决方案1】:
    NSString *data = @"abcde,";
    if([data hasSuffix:@","]) // This returns true in this example
        // do something
    

    【讨论】:

    • robinjam,谢谢您的回复。我试了一下,但没有用。是另一种方法吗?
    • robinjam,谢谢您的回复。我尝试了另一个 NSString *,它也可以。我想这是我的程序的其他一些问题。因为 NSString * 是从其他对象传递的,所以我可以显示 NSString 的最后一个字符,因为我想确认最后一个字符。谢谢。
    • 试试这个:NSString *lastCharacter = [myString substringFromIndex:[myString length] - 1]; NSLog(@"%@", lastCharacter);
    【解决方案2】:

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

    编辑

    我已经做了一些分析,在这个简单的案例中它是多余的(见我下面的评论)。无论如何,我将把答案留在这里,作为对这类事情使用谓词的示例。

    【讨论】:

    • 哇!谓词评估只是为了检查字符串的后缀?这有点矫枉过正。
    • 为什么过分了? -hasSuffix: 只是一种在 NSString 上设置搜索的便捷方法。仅仅因为它写得更短并不能使它更有效率。这也是来自文档的建议(正如我链接到的),它还为提问者提供了另一个选项来测试他的代码,因为 -hasSuffix: 方法不起作用,并引入了一种新的字符串搜索方法,提问者和其他人可能以前没有考虑过。
    • 这太过分了,因为你必须创建一个谓词对象,它必须解析谓词格式字符串,而且你必须用目标对象评估谓词对象。 hasSuffix: 只需确保接收者的最后一个字符等于参数。如果谓词endswith 只是在内部使用hasSuffix:,我不会感到惊讶。此外,在另一个答案中为hasSuffix: 提供的代码有效。如果它对 OP 不起作用,那么他没有给我们足够的信息来正确回答他的问题。
    • @dreamlax。你知道;你是对的。我做了一些分析,NSPredicate 方法比使用-hasSuffix 慢大约 3 倍。扫描 107,000 个单词需要 36 毫秒,而 14 毫秒(所以它仍然很快)。我的立场是正确的!
    • 我很想看看新的正则表达式 API 的表现如何。我敢打赌它会更慢,但谁知道呢。
    【解决方案3】:

    如果您担心性能,并且想要检查一个字符,使用 -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
    猜你喜欢
    • 2011-02-03
    • 1970-01-01
    • 2017-10-30
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 2012-01-16
    • 1970-01-01
    相关资源
    最近更新 更多