id型のオブジェクトのプロパティへアクセスできない?
似たようなクラスが複数あってそのどれかへ同じメッセージを送りたい場合に困ったことがあったのでメモ。
例えばViewController1とViewController2ってクラスがあって、それらのオブジェクトがviewController1とviewController2とするよ。どちらのクラスにもhoge、fooなんてプロパティがあるんだ。
ここでは二つのプロパティしか書いてないけどこれがたくさんあったらなんだか無駄と思うじゃない?
すると当然先に参照を得ておいて、それからプロパティのセットをしてやろうってなるよね。
それで書き直したのがこれ↓
id型のオブジェクトにはhogeなんてプロパティはございませぬ、だと、、、?
バカヤロー、なんのためにidでやってると思ってんだよ!って言いたくなるけどXcodeにいくら言ってもビルドしてくれないんじゃしょうがない、ここは書き直して、、、
例えばViewController1とViewController2ってクラスがあって、それらのオブジェクトがviewController1とviewController2とするよ。どちらのクラスにもhoge、fooなんてプロパティがあるんだ。
{ if (flag) { viewController1.hoge = hoge; viewController1.foo = foo; } else { viewController2. hoge = hoge; viewController2.foo = foo; } }↑このように条件によって送り先は違うんだけど、同じプロパティにアクセスして同じ値を設定したい場合。
ここでは二つのプロパティしか書いてないけどこれがたくさんあったらなんだか無駄と思うじゃない?
すると当然先に参照を得ておいて、それからプロパティのセットをしてやろうってなるよね。
それで書き直したのがこれ↓
{ id targetViewController; if (flag) { targetViewController = viewController1; } else { targetViewController = viewController2; } targetViewController.hoge = hoge; targetViewController.foo = foo; }このようにid型でtargetViewControllerで参照を得ておけばいいよね、と思ったんだけどこれだとXcodeはエラーをだしてビルドしてくれないんだ。

Property 'hoge' not found on object of type 'id'
id型のオブジェクトにはhogeなんてプロパティはございませぬ、だと、、、?
バカヤロー、なんのためにidでやってると思ってんだよ!って言いたくなるけどXcodeにいくら言ってもビルドしてくれないんじゃしょうがない、ここは書き直して、、、
{ [targetViewController setHoge:hoge]; [targetViewController setFoo:foo]; }このようにドット記法をやめてセッターでプロパティへアクセスするとエラーじゃなくなる。そうなのー?って気がしないでもないんだけど、そういうものみたい。
スポンサーサイト