0

我正在尝试使用 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
4

3 回答 3

2

我想你必须这样做:

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

有了这个,你把数值输入到 winCount NSString 中,然后你可以使用 isEqualToString 方法

于 2012-10-10T10:26:35.597 回答
1

抛出异常是因为您希望一个对象是 anNSString但实际上是 an NSNumber,因此您尝试调用未实现isEqualToString:NSNumber方法的对象。

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

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

现在你有一个数字的字符串表示,你可以执行isEqualToString:

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

于 2012-10-10T11:17:01.200 回答
1

我想你使用 JSON。然后对象的类型由 JSON 编码决定。如果"周围有,它是一个字符串。如果它是一个数字并且您想要字符串,请更改数据在服务器上的编码方式。

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

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

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

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

于 2012-10-10T11:20:20.980 回答