1

私はObjective-C(主にcocoa / apple Foundationフレームワークを使用)に比較的慣れていませんが、長年のC ++プログラマーなので、私が達成しようとしていることを説明することから始めます。私のアプローチが最善ではない可能性が高いので、別のアプローチの提案を聞いてみたいと思います。

json形式のテキストファイルがあります。次の簡単な例を作成しました。

"section1" : {
    "director" : "Sample Name 1",
    "writers" : {
        "name" : "Example Name 1",
        "name" : "Example Name 2",
    },
},

そして、このファイルを解析してこのクラスのインスタンスにいくつかの値を格納することを計画しているので、このファイル内のデータと一致させたいプロパティを持つクラスがあります。私のクラスヘッダーはおおよそ次のようになります。

@interface SongData : NSObject
@property (nonatomic, copy) NSString *director;
@property (nonatomic, copy) NSArray *writers;
@end

そのため、このjsonデータを正しいプロパティに保存するための最もクリーンで「データ駆動型」の方法を見つけようとしています。基本的に、データのjson「ディクショナリ」をループし、「キー」を使用してクラス内の正しいプロパティと照合し、そのプロパティに値を割り当てる方法が必要です。私が最初に試したのは、「キー」がjsonデータ内の適切なデータを検索するための実際のキーであり、「値」が正しいクラスプロパティへのポインターである辞書を作成したことです。このようなもの:

NSDictionary *descriptionDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:
                                       director, @"name",
                                       writers, @"writers",
                                       nil];

次に、jsonデータ(別のNSDictionaryに格納されている)をループし、「descriptionDictionary」の各キーを使用してjsonデータ内の適切な値を検索し、次に、に基づいて説明辞書の一致する「値」を使用するというアイデアでした。同じキー(私が望んでいたのは、実際のクラスプロパティへのポインタのようなものですか?)で、そのプロパティ値をjsonデータの値に設定します。おそらく例はそれをもう少し明確にするでしょう:-)。「jsonDictionary」が私のjsonデータを解析した結果であり、私はすでにセクション1内にいると仮定します。したがって、jsonDataNSDictionaryを構成するキーとdescriptionDictionaryNSDictionaryを構成するキーが1対1で一致するはずです。

[descriptionDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) {
    value = [jsonDictionary objectForKey:propertyName];
}];

これで、「value」は技術的にはクラスプロパティの1つを指し、関連するjsonデータをそれに割り当てたいと思います(つまり、director = @ "Sample Name 1")。私は自分がしていることに問題があることを知っています(ランダムなクラスプロパティへのポインタを逆参照して、未知のタイプの任意のオブジェクトを割り当てることはおそらくできないことを理解しています。すべてが一致することを望んでいます:-)が、例は、少なくとも私がやろうとしていることを示しているので、誰かが私にもっと良い方法を教えてくれます。

4

1 に答える 1

3

KVCをご覧ください(出典:http ://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueCoding/Articles/BasicPrinciples.html )

Key-Valueコーディングを使用した属性値の設定

メソッドsetValue:forKey:は、レシーバーを基準にした指定されたキーの値を、指定された値に設定します。setValue:forKey:のデフォルトの実装は、スカラーと構造体を表すNSValueオブジェクトを自動的にアンラップし、それらをプロパティに割り当てます。ラッピングとアンラッピングのセマンティクスの詳細については、「スカラーと構造体のサポート」を参照してください。

指定されたキーが存在しない場合、受信者にはsetValue:forUndefinedKey:メッセージが送信されます。setValue:forUndefinedKey:のデフォルトの実装では、NSUndefinedKeyExceptionが発生します。ただし、サブクラスはこのメソッドをオーバーライドして、カスタムの方法でリクエストを処理できます。

メソッドsetValue:forKeyPath:も同様に動作しますが、単一のキーだけでなくキーパスも処理できます。

最後に、setValuesForKeysWithDictionary:辞書キーを使用してプロパティを識別し、指定された辞書の値を使用してレシーバーのプロパティを設定します。デフォルトの実装では、キーと値のペアごとにsetValue:forKey:が呼び出され、必要に応じてNSNullオブジェクトがnilに置き換えられます。

考慮すべきもう1つの問題は、非オブジェクトプロパティをnil値に設定しようとしたときに何が起こるかです。この場合、受信者は自分自身にsetNilValueForKey:メッセージを送信します。setNilValueForKeyのデフォルトの実装:NSInvalidArgumentExceptionが発生します。アプリケーションは、このメソッドをオーバーライドしてデフォルト値またはマーカー値に置き換えてから、setValue:forKey:を新しい値で呼び出すことができます。

クラスプロパティがJSONフィールドと同じ名前である限り、を使用setValuesForKeysWithDictionary:してJSONルートディクショナリに渡すことができます。

異なる名前のキー/プロパティの場合は、をオーバーライドしsetValue:forUndefinedKey:て適切なプロパティを自分で設定するだけです。

最後に、JSONではプロパティとは異なるタイプで値が表される場合があります。たとえば、NSURLは代わりにNSStringになります。ここでは、渡されたパラメーターのクラスを簡単に確認し、IVARと一致しない場合は、変換を実行できます。

于 2012-12-29T11:19:04.860 に答える