如果值仅包含数字,则 AFNetworking 不会返回 NSString



我正在尝试使用AFNetworking在json中接收某个值。该值仅包含数字,我想将其作为 NSString 接收。当我比较收到的值时,我得到一个异常(本文后面也会提到异常)

这是产生错误的编码。

 NSArray *overallGameResultsArray = [resultDictionary valueForKey:@"overall_game_results"];
        winCountDictionary = [[NSDictionary alloc] init];
        for (NSDictionary *gameResultsDictionary in overallGameResultsArray)
        {
            NSString *userId = [gameResultsDictionary valueForKey:@"winner_user_id"];
            NSString *winCount = [gameResultsDictionary valueForKey:@"win_count"];
            if ([winCount isEqualToString:@"0"])
            {
                NSLog(@"0 wins");
            }
        } 
如果

注释了"如果比较",我不会得到例外。 win_count仅由 jSON 响应中的数字组成。

以下是我得到的异常错误。

2012-10-10 15:41:35.086 FMB[3549:c07] -[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0x7230af0 2012-10-10 15:41:35.086 FMB[3549:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0x7230af0'
*** First throw call stack: (0x1638012 0x1345e7e 0x16c34bd 0x1627bbc 0x162794e 0x11e03 0x20583 0x1fab4 0x245053f 0x2462014 0x24527d5 0x15deaf5 0x15ddf44 0x15dde1b 0x26997e3 0x2699668 0x28d65c 0x2512 0x2445) libc++abi.dylib: terminate called throwing an exception
我认为

你必须这样做:

NSString *winCount=[NSString stringWithFormat:@"%d",[[gameResultsDictionary valueForKey:@"win_count"]intValue];

有了这个,你将数字值放入winCount NSString中,然后你可以使用isEqualToString方法。

我想你使用JSON。然后,对象的类型由 JSON 编码确定。如果周围有",那就是一根绳子。如果它是一个数字,并且您希望在其中显示字符串,请更改数据在服务器上的编码方式。

但是,在这种情况下,使用数字更有意义。应按以下方式更改实现。

NSNumber* winCount = [gameResultsDictionary valueForKey:@"win_count"];
if ([winCount intValue] == 0) { //this would actually work for both NSNumber and NSString
    NSLog(@"0 wins");
}

使用字符串比较来比较数字总是暗示您做错了什么。

出异常是因为您希望对象是NSString但实际上是NSNumber,因此您尝试在不实现该方法的NSNumber上调用isEqualToString:

由于您知道winCount始终是一个数字,并且显然AFNetworking使用的 JSON 反序列化程序将响应中的数字装入NSNumber对象中,因此您可以轻松地从对象中获取一个字符串,如下所示:

NSString *winCount = [[gameResultsDictionary valueForKey:@"win_count"] stringValue];

现在您有了数字的字符串表示形式,因此可以执行isEqualToString:

另请注意,更优雅的解决方案可能是将对象作为id接收,找到它们的类并根据确定的类进行比较。

最新更新