4

我正在我的视图控制器中编写如下方法:

- (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 回答