2

私は Objective-C のまったくの初心者であり、Info.plist と Defaults.plist の違いについて、同じアプリの 2 つのビルドを比較する任務を負っています。

アプリ バンドルから PList を読み取る手順を理解できましたが、PLists のすべてのキーを対応するファイルと比較する方法を理解するのに苦労しています。例として、2 つのアプリ バンドル (build_100 と build_101 としましょう) の間で Info.plist を比較する必要がある場合、build_100 の各キーに再帰的に移動し、build_101 の同じキーを比較して同じかどうかを確認するにはどうすればよいですか。

TRUE を返すため、両方の PList が同じである場合は簡単ですisEqualToDictionaryが、ネストされたディクショナリ内の何かが両方のビルド間で異なる場合に問題が発生します。

ここで関連するクエリを実行すると、両方の PList を反復処理する再帰メソッドを作成することが答えであることがわかりますが、Info.plist.

4

2 に答える 2

1

だから私はついにこのことを理解したので、将来の参考のために他の人と共有することを考えました。将来、似たようなものを探している他の失われた魂があると確信しています(または少なくとも私は願っています:))。

私がコードを書いた方法は次のとおりです。

  1. NSDictionariesの両方のPlistを読む
  2. 1つのPlistを「テスト対象」として扱い、もう1つのPlistを(比較するための)参照として扱い、合格/不合格かどうかを確認します。
  3. 「テスト対象」Plistのすべてのキーをループし、「参照」Plistの各キーを比較します
  4. 配列または辞書を比較する場合、このチェック(これは私が苦労していた部分です)は再帰的なチェックでなければなりませんでした

ステップ1、2、3で作成するコードは単純なので、元の質問の核心である#4で作成したメソッドを示します。

この関数compareSourceObject()は、次の3つの引数を取ります。

  • sourceObject:テストするオブジェクト
  • targetObject:比較するオブジェクト
  • trailPath:失敗したキーのパス全体を保持する文字列
-(void)compareSourceObject:(id)sourceObject andTargetObject:(id)targetObject withBreadcrumbTrail:(NSString *)trailPath {
    NSString * message = [[NSString alloc] init];

    if([sourceObject isKindOfClass:[NSDictionary class]]){
        for(sourceObjectのidアイテム){
            [self compareSourceObject:[sourceObject objectForKey:item] andTargetObject:[targetObject objectForKey:item] withBreadcrumbTrail:[trailPath stringByAppendingFormat:@ "->%@"、item]];
        }
    }
    else if([sourceObject isKindOfClass:[NSArray class]]){
        for(int counter = 0; counter%d "、counter]];
        }
    }
    else if(![sourceObject isEqual:targetObject]){
        NSLog(@"値が一致しません。\"TestedDicationary\ "の値は(%@)ですが、参照dictには(%@)"、targetObject、sourceObject);があります。
    }
}

お役に立てれば。コメント/提案/最適化は大歓迎です。

于 2012-11-15T11:10:12.273 に答える
0

NSSet1 つの plist を取得し、プロパティを文字列値のセット ( ) として解釈します。

:items:0:assets array

:items:0:assets:0:kind string VALUE

/usr/libexec/PlistBuddyプロパティを記述するために format を使用していることに注意してください- path type [value]

次に、2 番目の plist に対して同じことを行い、NSSet関数を使用してセットを比較します。

于 2012-10-26T09:21:08.057 に答える