在我的应用中有一种机制,要求在某一点上两个NSString
将是相同的做某事;由于某种原因,当我比较两者时,即使它们是相同的,它仍然不能识别。代码是这样的:
NSString * aString = [self someMethodThatGetsAString];
NSString * bString;
BOOL areStringsTheSame = NO;
while (areStringsTheSame != YES) {
bString = [self someMethodThatTakesNSStringsFromAnArrey];
if (bString == aString) {
areStringsTheSame = YES;
{ }
我甚至插入了一个NSLog()
,并确保在某一点上它们是相同的(据我所知,这就是==
所代表的…),但它仍然没有进入if
来改变BOOL
的值。
有没有别的方法来做这个比较?我错过什么了吗?
可以使用方法isEqualToString::
if ([bString isEqualToString:aString])
==
比较字符串的引用(地址),而不是字符串的值。
这个方法对我很有效:
if ([firstString compare:secondString] == NSOrderedSame) {
//Do something when they are the same
} else {
//Do something when they are different
}
最近我被一个事实震惊了,两个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]]];
}
}