【问题标题】:Compare two NSStrings比较两个 NSString
【发布时间】:2011-08-06 21:45:02
【问题描述】:

在我的应用程序中,有一种机制要求在某个时刻两个NSStrings 将相同地做某事;出于某种原因,当我比较两者时,即使它们相同,它仍然无法识别。代码是这样的:

NSString * aString = [self someMethodThatGetsAString];

NSString * bString;

BOOL areStringsTheSame = NO;

while (areStringsTheSame != YES) {

       bString = [self someMethodThatTakesNSStringsFromAnArrey];
       if (bString == aString) {
             areStringsTheSame = YES;
       { }

我什至插入了一个NSLog() 并确保在某个时候它们是相同的(据我所知,这就是== 的意思......),但它仍然没有进入if 更改 BOOL 值。

还有其他方法可以进行这种比较吗?我错过了什么吗?

【问题讨论】:

    标签: cocoa-touch nsstring string-comparison


    【解决方案1】:

    可以使用isEqualToString:的方法:

    if ([bString isEqualToString:aString])
    

    == 比较字符串的引用(地址),而不是字符串的值。

    【讨论】:

    • 是的。并深入挖掘 OOP 的原理(具有相同属性的两个对象不一定是相同的对象)。否则,你在开发者生活的每一天都会遇到这个问题 :-)
    • 显然== 在区分大小写的情况下比较字符串同样有效,因为 Objective-C 使用字符串变量的方式。例如,声明一个字符串 A 和字符串 B,然后执行==,你会发现它们都存储在同一个地址中。
    【解决方案2】:

    这种方法对我有用:

    if ([firstString compare:secondString] == NSOrderedSame) {
        //Do something when they are the same
    } else {
        //Do something when they are different
    }
    

    【讨论】:

    • 我今天找到了,如果一个是nil 而一个不是,则返回NSOrderedSame
    【解决方案3】:

    最近让我震惊的是,两个在 NSLog 上相似的 NSString 可能不同。这是因为有时 NSString 可以包含零宽度的空格字符。请注意这一点并考虑:

    #define ZERO_WIDTH_SPACE_STRING @"\u200B"
    

    要克服这个问题,您应该在比较之前从零宽度空白字符中清除字符串:

    NSMutableString *eMailToAdd = [NSMutableString string];
    
    NSMutableCharacterSet *charSet = [[NSCharacterSet whitespaceCharacterSet] mutableCopy];
        //[charSet formUnionWithCharacterSet:[NSCharacterSet punctuationCharacterSet]];
    
        NSString *rawStr = [[tokenField textField] text];
        for (int i = 0; i < [rawStr length]; i++)
        {
            if (![charSet characterIsMember:[rawStr characterAtIndex:i]])
            {
                [eMailToAdd appendFormat:@"%@",[NSString stringWithFormat:@"%c", [rawStr characterAtIndex:i]]];
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      相关资源
      最近更新 更多