0

1つ以上のオブジェクトを取り戻すとすべてが機能しますが、1つだけが奇妙に反応する場合、その解決策を見つけることができません。

まず、すべてを配列に設定します。

NSArray *array = [[[dictionary objectForKey:@"Response"] objectForKey:@"objecten"] objectForKey:@"object"];
if (array == nil) {
    NSLog(@"Expected 'results' array");
    return;
}

次に、辞書でforループを使用します

for (NSDictionary *resultDict in array) {

    SearchResult *searchResult;


NSString *wrapperType = [resultDict objectForKey:@"type"];    

 if ([wrapperType isEqualToString:@"rent"]) 
 {
        searchResult = [self parseHuur:resultDict];

 }

        if (searchResult != nil) {
            [searchResults addObject:searchResult];
        }}

したがって、結果が1を超えるとすべてがうまく機能しますが、1つだけが戻った場合は次のようになります。

-[__NSCFString objectForKey:]: unrecognized selector sent to instance 0x6e52c30
*** Terminating app due to uncaught exception 
'NSInvalidArgumentException', reason: '-[__NSCFString objectForKey:]: 
unrecognized selector sent to instance 0x6e52c30'

それはこの線を指しています:

NSString *wrapperType = [resultDict objectForKey:@"type"];    

本当にわかりません...同じリンクを使用してブラウザーでAPIの結果を確認すると、実際には1つのオブジェクトが返されますが、resultDict(NSlog it)をログに記録すると、答えは1つだけになります。すべてのパラメータを持つオブジェクト全体(これが正しい名前かどうかはわかりません)

どうしてそれができるのでしょうか?

4

5 に答える 5

2

結果の一部は、完全な NSDictionaries ではなく、単なる NSString です。これを確認できます:

for (id result in array) {
   if ([result isKindOfClass:[NSDictionary class]]) {
      NSDictionary *resultDict = (NSDictionary *)result;
   ...
于 2012-11-14T18:32:16.923 に答える
1

あなたのコメントによるarrayと、あなたが言及したように、は必ずしも配列ではありません。配列または辞書である可能性があります。だからこれを試してみてください

id someObject = [[[dictionary objectForKey:@"Response"] objectForKey:@"objecten"] objectForKey:@"object"]; //naming it as someObject since it is not always an array

if (someObject == nil) {
    NSLog(@"Expected 'results' array");
    return;
}

if ([someObject isKindOfClass:[NSDictionary class]]) { //Just add this
    someObject = [NSArray arrayWithObject:someObject];
} 

NSArray *array = (NSArray *)someObject;//type cast to an array now

for (NSDictionary *resultDict in array) {

   SearchResult *searchResult;
   NSString *wrapperType = [resultDict objectForKey:@"type"];    

   if ([wrapperType isEqualToString:@"rent"]) 
   {
        searchResult = [self parseHuur:resultDict];
   }
   if (searchResult != nil) {
        [searchResults addObject:searchResult];
   }
}
于 2012-11-15T01:05:03.580 に答える
1

NSDictionary の高速列挙を使用する場合、反復変数は、値ではなく辞書内のキーのセットから取得されます。

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocFastEnumeration.html

于 2012-11-14T18:34:57.787 に答える
0

resultDict は NSDictionary ではないため、このオブジェクトで objectForKey: を呼び出すことはできません。

より良い解決策は、resultDict をfor ループでid 型として扱い、それを使用する前に NSDictionary のクラス型をチェックすることです。

于 2012-11-14T18:33:53.343 に答える
0
-[__NSCFString objectForKey:]

objectForKey:したがって、 でメソッドを呼び出していNSStringます。オブジェクトを取得するために使用している API は、一般的なイディオムに従っているようです: ダックタイピング/ポリモーフィズム (これらの素敵なオブジェクト指向関連の言葉を使用するため) を使用し、結果以上のオブジェクトがある場合はオブジェクトの配列を返します。または、結果が 1 つしかない場合の単一のオブジェクト ( 1 つの要素の配列ではない)。したがって、リフレクション (OMG、さらに OO 用語!) を使用して、返されたオブジェクトが実際に配列であるかどうかを調べる必要があります。

id result = [dictionary objectForKey:@"Response"];
id value;
if ([result isKindOfClass:[NSDictionary class]]) {
    value = [[result object objectForKey:@"objecten"] objectForKey:@"object"];
} else {
    value = result;
}

また

id value;
if ([dictionary isKindOfClass:[NSDictionary class]]) {
    value = [[[dictionary objectForKey:@"Result"] result object objectForKey:@"objecten"] objectForKey:@"object"];
} else {
    value = dictionary;
}

両方を試してみてください。どちらでも問題ありません。

于 2012-11-14T18:34:52.800 に答える