1

オブジェクトのイントロスペクションを実行する、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;
            /* ... */
        }
    }
}

「この時点でそれが であることはわかっているので、これらのセレクターとプロパティに応答しないと言うのはやめてください」のようなコンパイラーに伝える方法はありますotherBallBBBallView? そうすれば、次のように書くことができます:

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. いずれにせよ、オブジェクトのプロパティに対して複数の計算を実行する必要があるメソッドでは、これらすべての括弧ですぐに判読できなくなるため、全体の試練は特に面倒です。

これを回避する方法はありますか?

前もって感謝します!

4

2 に答える 2

4

正しいタイプのローカル temp を作成するか、ドット表記を使用しないようにすることができます。

  1. ローカル温度

    for (UIView *view in self.gameField.subviews) {
      if ([view isKindOfClass:[BBBallView class]]) {
        BBBallView *ballView = view;
        if (!ballView.isEnlarged) {
          CGRect otherFrame = ballView.frame;
          /* ... */
        }
      }
    }
    
  2. ドット表記を使用しない

    for (id otherBall in self.gameField.subviews) {
      if ([otherBall isKindOfClass:[BBBallView class]]) {
        if ( ![otherBall isEnlarged]) {
          CGRect otherFrame = [otherBall frame];
          /* ... */
        }
      }
    }
    

2、3 のことしかしていない場合は、ドット表記を使用しないように誘惑されるでしょう。アクセスが多くて読みづらくなったらローカルテンプを検討します

于 2013-04-25T14:05:47.490 に答える
1

ロジックが間違っているように見えるので、苦労していると思います。言語があなたと戦っているのは、言語に欠陥があるからではなく、プログラムの構造が原因です。

サブビューの親タイプは本当に適切ですか? それとも四角い活字に丸いものを詰め込むことでリスコフの置換原理に違反しているのでしょうか?

BBBallView ロジックの内部を外部から調べることが本当に適切かどうかを尋ねることもできますか? ロジックを適切なクラスに移動できますか?

于 2013-04-25T14:05:03.723 に答える