3

インスタンス変数を単純化するオブジェクトがあります。一部は NSString で、一部は unsigned int などです。次のようなコードを記述できるという点で、Key-Value コーディングはスクリプト可能であるという印象を受けました。

   id key, value;
   key      = [[attributes objectAtIndex:j] name];
   value    = [[attributes objectAtIndex:j] stringValue];
   [obj setValue:value forKey:key];

ここで stringValue と name を使用している理由は、TouchXML を使用して XML フィードからオブジェクトを構築しているためです。

整数に何かを割り当てようとすると、上記のコードがクラッシュします。unsigned int を NSString のインスタンスに変更すると、ランタイム クラッシュは発生しません。Key-Value コーディングは、これらの問題を検出するのに十分スマートであると理解していました。

私の可能な解決策は何ですか?独自のインスタンス変数を持つ多くの異なるクラスで同じメソッドを実行できるように、これを可能な限り抽象化するにはどうすればよいですか?

セッターを実際にオーバーライドし、NSNumber を使用して文字列を int 型に変換する最もエレガントな方法は、KVC によって既に処理されていると思われますか?

4

1 に答える 1

3

KVC は内部で型の強制/変換を行わないため、渡すオブジェクトsetValue:forKey:の型は、それが格納されるインスタンス変数の型と一致する必要があります。 、 などのネイティブ型intはオブジェクトにlongパッケージ化され、NSNumber構造体のようなものはオブジェクトにパックされNSValueます。ネイティブ型として宣言された値を設定するには、value 引数に適切なラッパー オブジェクトを渡す必要があります。

また、セッター自体ではなく、セッターを呼び出すコードで必要な変換を行うことをお勧めします。ただし、それは意見の問題であるため、本当に必要な場合はセッターで翻訳できると思います。コードの私のバージョンは次のようになります。

id key, value;
key = [[attributes objectAtIndex:j] name];
value = [NSNumber numberWithInt:[[[attributes objectAtIndex:j] stringValue] intValue]];
[obj setValue:value forKey:key];
于 2008-12-19T20:10:46.897 に答える