4

View Controllerで以下のようにメソッドを書いています:

- (IBAction)expressionEvaluation:(UIButton *)sender {
    NSDictionary *testValues = [NSDictionary dictionaryWithObjectsAndKeys:@"x", 2, @"y", 3, @"z", 4, nil];
    //the below line gives the error
    double result = [self.brain evaluateExpression:self.brain.expression usingVariableValues:testValues];
    NSString *resultString = [NSString stringWithFormat:@"%g", result];
    self.display.text = resultString;
}

そして、私の「脳」クラスでは、まだ完成していないメソッドを宣言しました。

#import <Foundation/Foundation.h>

@interface CalculatorBrain : NSObject
- (void) pushOperand:(double)operand;
- (void) setVariableAsOperand:(NSString *)variableName;
- (void) performWaitingOperation;
- (double) performOperation:(NSString *)operation;

@property (readonly) id expression;
+ (double)evaluateExpression: (id)anExpression
         usingVariableValues: (NSDictionary *)variables; //declared here
@end

....h と .m:

+ (double) evaluateExpression:(id)anExpression usingVariableValues:(NSDictionary *)variables {
    double result = 0;
    int count = [anExpression count];
    for (int i = 0; i < count; i++) {

    }

    return result;
}

「'CalculatorBrain' の目に見える @interface がセレクター 'evaluateExpression:usingVariableValues' を宣言していません」というエラーが表示されるのはなぜですか? 私はobjective-cが初めてですが、これは私の宣言が表示されていないことを意味すると思います。ただし、私はこの言語に慣れていないため、構文/フォーマットの問題かどうかはわかりません。

4

3 に答える 3

4

evaluateExpression:usingVariableValues:クラスメソッドとして宣言していることに注意してください

+ (double)evaluateExpression: (id)anExpression  // + means class method
     usingVariableValues: (NSDictionary *)variables; //declared here

インスタンスメソッドのように使用します

// assuming self.brain is an instance of CalculatorBrain
[self.brain evaluateExpression:self.brain.expression usingVariableValues:testValues];

したがって、メソッドを次のように変更します

- (double)evaluateExpression: (id)anExpression  // - means instance method
     usingVariableValues: (NSDictionary *)variables; //declared here

またはこのように呼び出します

[CalculatorBrain evaluateExpression:self.brain.expression usingVariableValues:testValues];
于 2013-02-25T00:40:35.897 に答える
3

「+」記号はクラスメソッドを意味します。インスタンスではなく、クラス名を介してアクセスできます。

お気に入り

[MyClass methodName];

「-」記号はインスタンス メソッドを意味します。クラスのインスタンスを介してアクセスできます(割り当て初期化後)。

お気に入り

MyClass *myInstance = [[MyClass alloc] init];

[myInstance methodName];
于 2013-02-25T00:38:56.560 に答える
2

MOXY そうですね。

  + (double)evaluateExpression: (id)anExpression;

クラスメソッドであり、クラスに送信されます。通常、新しいオブジェクトの作成などにはクラス メソッドを使用します。

  + (NSString*) stringWithString: (NSString*) s;

あなたが欲しいのはインスタンスメソッドです:

 - (double) evaluateExpression: (id) anExpression;

オブジェクトのインスタンスに送信します。

于 2013-02-25T00:42:51.457 に答える