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

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;
}

在我的“brain”类中,我声明了尚未完成的方法:

#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的新手,但我想这意味着它没有看到我的声明。不过我不确定是否存在语法/格式问题,因为我是这种语言的新手。
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];

3

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

例如:

[MyClass methodName];

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

例如:

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

[myInstance methodName];

2

MOXY是正确的。

  + (double)evaluateExpression: (id)anExpression;

这是一个类方法,发送给类。通常你会使用类方法来构建新的对象:

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

你需要的是一个实例方法:
 - (double) evaluateExpression: (id) anExpression;

您需要将其发送到对象实例上的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接