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");
            }

        } 

「if比較」がコメントされている場合、例外は発生しません。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

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 に答える
1

オブジェクトが であると予想NSStringしているが、実際には であるため、例外がスローされます。そのため、メソッドを実装していないNSNumberを呼び出そうとします。isEqualToString:NSNumber

これは常に数値であり、応答内の数値をオブジェクトにボックス化するwinCountJSON デシリアライザーを使用しているように見えるため、次のようにオブジェクトから文字列を簡単に取得できます。AFNetworkingNSNumber

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

これで、数値の文字列表現が得られたので、実行できますisEqualToString:

また、より洗練された解決策は、オブジェクトを として受け取り、idそれらのクラスを見つけて、決定されたクラスに基づいて比較を行うことです。

于 2012-10-10T11:17:01.200 に答える