ほとんどの場合、Key-Value コーディングを実装する必要はありません。代わりに、さまざまな規則に準拠するクラスを作成すると、Key-Value コーディングが自動的に機能します。
規則は、KVC を介してプロパティにアクセスできるようにするためにメソッドに名前を付ける方法に関するものです。
あなたのコード:
univ=[[Universal alloc] init];
[univ setValue:univ.datamember1 forKey:@"1"];
[univ setValue:univ.datamember2 forKey:@"2"];
[univ setValue:univ.datamember3 forKey:@"3"];
[univ setValue:univ.datamember4 forKey:@"4"];
[univ setValue:univ.datamember5 forKey:@"5"];
は奇妙です。ここで何をしようとしていますか?このコードはuniv
、オブジェクトの他のプロパティからオブジェクトのプロパティを設定しようとしているようuniv
です。それは冗長です。
ここでシノニムまたはエイリアスを確立していると思います-キー「1」をプロパティにマップしていると思いますdatamember1
。それは正しくありません。-setValue:forKey:
メソッドは、プロパティの値を実際に設定するためのものです。これは、setter メソッドを呼び出すのと非常によく似ています。実際、通常は setter メソッドが呼び出されます。
したがって、あなたが書いたものは次のようになります。
univ=[[Universal alloc] init];
[univ set1:univ.datamember1];
[univ set2:univ.datamember2];
[univ set3:univ.datamember3];
[univ set4:univ.datamember4];
[univ set5:univ.datamember5];
私はそれがあなたの意図したものではないかと疑っています。KVC 以外の用語で何をしようとしているのかを説明すると役立つ場合があります。どのプロパティを変更しようとしていますか (変更している場合)? それらにどのような値を割り当てますか? 通常のセッターとゲッターだけを使用して、どのようにそれを行いますか?
後で、このコードを投稿しました:
id temp1=[univ valueForKey:@"1"];
temp1=strVal;
[resultArray addObject:univ];
繰り返しますが、これは奇妙で紛らわしいです。のプロパティ値を変更しようとしていると思われますがuniv
、動作させることができたとしても、それはそのコードが達成することではありません。univ
最初の行は、プロパティの名前が「1」であるオブジェクトのプロパティの値を取得しようとします。プロパティの有効な名前ではありません。とにかく、取得した値をローカル変数に格納しますtemp1
。2 行目は、1 行目の結果を単純に破棄し、別の値をローカルtemp1
変数に格納します。temp1
変数は、オブジェクトから取得した結果を格納していた直前でも、オブジェクトから独立してuniv
いuniv
ます。変更しても変更temp1
できませんuniv
(が指すオブジェクトにメッセージを送信しますが)temp1
そのオブジェクトを変更する可能性があり、 によって指されている可能性もありますuniv
)。
Key-Value Coding を使用する準備がまだできていないようです。基本をよりよく理解する必要があります。また、コンパイル時に既知の静的なキーで Key-Value Coding を使用する必要はほとんどありません。キー値コーディングは、コンパイル時にそのプロパティの名前がわからないが、実行時にデータとして名前を取得できる場合に、オブジェクトのプロパティに動的にアクセスするためのものです。