'class-name'没有可见的@interface声明选择器'method-name'

时间:2013-02-25 00:35:15

标签: ios objective-c syntax

我正在我的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;
}

为什么我得到这个“没有可见的@interface为'CalculatorBrain'声明选择器'evaluateExpression:usingVariableValues'”错误?我是Objective-c的新手,但我想这意味着它没有看到我的声明。我不确定这是否是语法/格式问题,因为我是该语言的新手。

3 个答案:

答案 0 :(得分: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];

答案 1 :(得分:3)

“+”符号表示类方法。您可以通过类名访问它,而不是它的实例。

喜欢

[MyClass methodName];

“ - ”符号表示实例方法。您可以通过类的实例访问它(在分配之后。

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

[myInstance methodName];

答案 2 :(得分:2)

MOXY是对的。

  + (double)evaluateExpression: (id)anExpression;

是一个类方法,并被发送到类。您通常使用类方法来构建新对象:

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

你想要的是一个实例方法:

 - (double) evaluateExpression: (id) anExpression;

您将发送到对象上的实例。