isEqualToString 总是返回 False

Posted

技术标签:

【中文标题】isEqualToString 总是返回 False【英文标题】:isEqualToString always returns False 【发布时间】:2015-02-13 20:13:56 【问题描述】:

在我开始之前,这里有一点背景知识,基本上我们希望将 UDP 响应与存储在 Parse 数据库中的字符串进行比较,以供我们的应用程序使用。这个问题是我似乎无法让 isEqualToString 函数认为字符串相等。这是我现在运行的代码,我尝试了一些我在其他问题中看到的解决方法,但它仍然不起作用。

- (BOOL) onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port

    if(tag == TAG_SINGLE_GRILL)
    
        NSString *grillId = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        if(grillId.length > 11)
        
            grillId = [grillId substringToIndex:11];
        
        grillId = [NSString stringWithFormat:@"%@", grillId];
        if([grillId hasPrefix:@"GMG"])
        
            for(int i = 0; i < [parseGrills count]; i++)
            
                NSString *parseGrillId = [[parseGrills objectAtIndex:i] grillId];
                parseGrillId = [NSString stringWithFormat:@"%@", parseGrillId];
                //If we match the id, add it to found grills
                if([grillId isEqualToString:parseGrillId])
                
                    //do stuff
                
            
        
        NSLog(@"Grill ID : %@", grillId);
    
    return TRUE;

parseGrills 是一个 NSMutableArray,带有一个非常基本的 Grill 对象,我使用 synthesize 作为属性,否则 .m 文件基本上是空的。

#import <Foundation/Foundation.h>

@interface Grill : NSObject

@property (nonatomic) NSString* grillId;
@property (nonatomic) NSString* ipAddress;

@end

这是调试器返回 false 后的屏幕截图

任何帮助将不胜感激。谢谢。

【问题讨论】:

【参考方案1】:

我猜它们的编码不同。

我做过这个实验,看看如果编码不同,会返回NO。因此,请尝试使用以下代码将parseGrillId 转换为utf8

NSString *s1 = [NSString stringWithCString:"HELLO123" encoding:NSUTF8StringEncoding];
NSString *s2 = [NSString stringWithCString:"HELLO123" encoding:NSUTF16StringEncoding];
NSString *s3 = [NSString stringWithUTF8String:s2.UTF8String];

if ([s1 isEqualToString:s2]) 
    NSLog(@"s1 == s2");


if ([s1 isEqualToString:s3]) 
    NSLog(@"s1 == s3");

将打印s1 == s3

【讨论】:

成功了,比较返回 1 和 -1,我将 parseGrillId 转换为 UTF 8,它现在返回 true。谢谢。

以上是关于isEqualToString 总是返回 False的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在使用 Passport 和会话时没有保持登录状态? Passport 的“isAuthenticated()”总是返回 false

使用 isEqualToString 时访问错误

isEqual,isEqualTostring,==三者的区别

判断字符串是否相等 isEqualToString:

NSDictionary 获取值作为字符串不会抱怨但 lenngth 或 isEqualToString 崩溃

[NSCFNumber isEqualToString:]:无法识别的选择器发送到实例