オブジェクトのイントロスペクションを実行する、Objective-C のいくつかの列挙ルーチンに取り組んでいます。特に、プロパティを微調整したり、メソッドを呼び出したりする前に、高速に列挙し、NSSet
その中のオブジェクトがクラスに属していることを確認しています(かなり残念な名前です、同意します)。BBBallView
ただし、パーサーとコンパイラーを満足させるために、1 行ごとにオブジェクトをそのクラスにキャストすることになります。さらに、そのプロパティにアクセスするには、オブジェクトのキャストを括弧で囲む必要があります。そうしないと、ドット表記が機能しません。これにより、やや厄介なコードが生成されます。
for (id otherBall in self.gameField.subviews) {
if ([otherBall isKindOfClass:[BBBallView class]]) {
if ( !((BBBallView *)otherBall).isEnlarged ) {
CGRect otherFrame = ((BBBallView *)otherBall).frame;
/* ... */
}
}
}
「この時点でそれが であることはわかっているので、これらのセレクターとプロパティに応答しないと言うのはやめてください」のようなコンパイラーに伝える方法はありますotherBall
かBBBallView
? そうすれば、次のように書くことができます:
for (id otherBall in self.gameField.subviews) {
if ([otherBall isKindOfClass:[BBBallView class]]) {
if ( !otherBall.isEnlarged ) {
CGRect otherFrame = otherBall.frame;
/* ... */
}
}
}
等々。
試してみotherBall = (BBBallView *)otherBall
ましたが、「デフォルトでは、ARCで高速列挙変数を変更できません」。列挙変数を変更して__strong id
修正しますが、後続の行で「タイプ 'const __strong id' のオブジェクトにプロパティが見つかりません」などのエラーが発生するという事実は役に立たないため、isEnlarged
正方形に戻ります。
なぜこれが起こるのか正確にはわかりません.変数の型がid
. いずれにせよ、オブジェクトのプロパティに対して複数の計算を実行する必要があるメソッドでは、これらすべての括弧ですぐに判読できなくなるため、全体の試練は特に面倒です。
これを回避する方法はありますか?
前もって感謝します!