0

私はこのようなjson構造を持っており、ネストされた各ウィジェット配列の「タイプ」をチェックしようとしています。したがって、特定のタイプの場合は、フェードステップ、幅、高さなどのプロパティを抽出しようとしています。

forループを使用してそれを行う方法はありますか?今私はこのようにやっています:

for (NSString *widgetArray in widgets)
{
    NSLog(@"%@", widgetArray);
}

その内容を印刷するには、対応する値を抽出するにはどうすればよいですか?for(NSDictionary * asset in [assets allValues]){NSString * type = Asset [@ "type"];

    if ([type isEqualToString:@"gradient"])
    {
        [gradients addObject:asset];

    }

これは、辞書の内容にアクセスするのに役立ったメンバーの1人によって提供された擬似コードであり、ネストされた配列構造に同様のロジックを適用することはできません。

4

3 に答える 3

0

各要素のタイプを確認するには、NSObject isKindOfClass:メソッドを使用します。

だから、あなたは次のようなものを持っているかもしれません:

if ([obj isKindOfClass:[NSDictionary class]]) { ... }

または

if ([obj isKindOfClass:[NSArray class]]) { ... }

@ H2CO3が言うように、objectAtIndex:配列要素objectForKey:にアクセスし、辞書要素にアクセスするために使用します。

編集:「特定のタイプの」とは、OPがエントリのobjective-cクラスではなく、「type」フィールドの値を意味することに気づきました。それでも、JSONデータを読み取るときに、エントリが配列か辞書かを判断するのに役立つことが多いので、ここに答えを残しておきます。

于 2013-02-11T18:22:49.407 に答える
0

最新のObjectiveCでは、C配列のような添え字を使用できます。例えば、

NSLog(@"%@", widgetArray[i]);

辞書の場合、キーを使用して抽出できます。

NSString* id = myDict[@"id"];
于 2013-02-11T18:24:09.877 に答える
0

問題は再帰検索であるため、スタックを使用する必要があります。手順は次のとおりです。

  1. NSMutableArrayスタックとして機能するものを作成します。今は空です。
  2. ルートwidgets配列を取得し、そのすべてのオブジェクトをスタックに配置します(-addObjectsFromArray:)。
  3. スタックの最初のウィジェット(NSDictionary)を取り出します。変数に格納した後は、必ずスタック-removeObjectAtIndex:)から取り出してください。
  4. typeその変数を使用して、比較やその他のことを行います。
  5. そのサブウィジェットを取得し、手順2と同様に、それらすべてをスタックに配置します。
  6. スタックに何かが含まれている場合は、手順3から繰り返します。それ以外の場合は、すべてのウィジェットを処理しました。

擬似コード:

// 1
NSMutableArray *stack = [NSMutableArray array];
// 2
[stack addObjectsFromArray:rootWidgets];
while (stack.count > 0) {
    // 3
    NSDictionary *widgetDict = [stack objectAtIndex:0];
    [stack removeObjectAtIndex:0];
    // 4
    if ([[widgetDict objectForKey:@"type"] isEqualToString:...]) // Do whatever...
    // 5
    [stack addObjectsFromArray:[widgetDict objectForKey:@"widgets"]];
}
// 6
// You are done...
于 2013-02-11T19:59:27.967 に答える