0

私は電卓を作成しており、CalculatorBrain と呼ばれるクラスを持つ CalculatorFirstViewController と呼ばれる数学部分用の 2 つの MVC があります。GraphViewController と呼ばれるグラフ部分のもう 1 つ。

CalculatorController では、mutableArray を電卓スタックとして使用し、それをセグエ経由でグラフ ビュー コントローラに渡します。GraphView のプロパティは、graphingPoints と呼ばれます。その後 drawrect を通過し、グラフ化する点の配列を作成する "programToGraph" メソッドを呼び出します。私を混乱させるのは、「ru​​nProgram」は別のオブジェクトファイルであるCalculatorBrainでのみ宣言されているにもかかわらず、「programGraph」内で「runProgram:usingVariableValues」メソッドを呼び出すことです。このメソッド呼び出しが機能するのはなぜですか?

@interface CalculatorFirstViewController ()
@property (nonatomic, strong) CalculatorBrain *brain;
@end

@implementation CalculatorFirstViewController
@synthesize brain = _brain;

- (CalculatorBrain*) brain{
   if(!_brain) _brain = [[CalculatorBrain alloc] init];
   return _brain;
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

   if([segue.identifier isEqualToString:@"Graph"])
   //The call [self.brain program] returns the CalculatorStack
    [segue.destinationViewController setGraphingPoint:[self.brain program]];
  }

これは、Calculator MVC で使用される CalculatorBrain オブジェクトで宣言されている RunProgram の宣言です。クラスメソッドです。スタックで操作を実行した値を返すだけです。

+ (double)runProgram:(id)program usingVariableValues:(NSDictionary*)variableValues;

これはgraphViewControllerコードです。

-(void) setGraphingPoint:(NSMutableArray*) graphingPoint{

if(_graphingPoint == nil) _graphingPoint = [[NSMutableArray alloc] init ];
    _graphingPoint = graphingPoint;
    //this will call drawrect
    [self.graphingView setNeedsDisplay];
}


-(id) programToGraph:(GraphingView *)sender{

    CGPoint graphPoint;
    NSMutableArray *pointValues = [[NSMutableArray alloc] init];

    for( int x =0;x<5; x++)
    {
        NSDictionary* xValue = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:x] forKey:@"X"];
        graphPoint.x =x;

     //This is the main part I dont get, If calculatorBrain is a seperate object file 
     //and I didn't import it, how am I able to call the method by just saying 
     //CalculatorBrain as the receiver? 

        graphPoint.y = [CalculatorBrain runProgram: self.graphingPoint usingVariableValues:xValue];

        [pointValues addObject:[NSValue valueWithCGPoint:graphPoint]];

}

return pointValues;

}

では、CalculatorBrain ファイルをインポートせず、セグエ経由で他のコントローラーに渡さなかったのに、どうして runProgram を呼び出すことができるのでしょうか?

4

1 に答える 1

0

Objective-c では、オブジェクトのセレクター (メソッド) を宣言なしで呼び出すことができます。これは、実際の呼び出しが実行時に検索されるためです。これにより、コンパイル時ではなく、必要なときに実行時に呼び出しが検出されるため、他のライブラリに実装されているクラスの拡張メソッドをコードに含めることができます。

したがって、メソッドが存在するため、呼び出しは実行時に検索され、正常に機能します。この状況では、コンパイラはコンパイル時にメソッドが見つからないという警告を出す必要がありますが、それでもコンパイルは成功します。

編集: @class を使用してクラス自体を前方宣言する必要があります。

于 2012-07-22T22:59:26.943 に答える