【问题标题】:No visible @interface for 'class-name' declares the selector 'method-name''class-name' 没有可见的@interface 声明选择器'method-name'
【发布时间】:2013-02-25 00:35:14
【问题描述】:

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

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

【问题讨论】:

    标签: ios objective-c syntax


    【解决方案1】:

    注意您将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];
    

    【讨论】:

      【解决方案2】:

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

      喜欢

      [MyClass methodName];
      

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

      喜欢

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

      【讨论】:

        【解决方案3】:

        MOXY 是对的。

          + (double)evaluateExpression: (id)anExpression;
        

        是一个类方法,并被发送到类。您通常将类方法用于构造新对象之类的事情:

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

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

         - (double) evaluateExpression: (id) anExpression;
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-10-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-27
          • 2021-09-22
          相关资源
          最近更新 更多