2013-02-25 60 views
3

,我在我的視圖控制器,如下編寫方法:爲「類名」無可見@interface聲明選擇「方法名」

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

爲什麼會出現這種「不可見@inter面對'CalculatorBrain'聲明選擇器'evaluateExpression:usingVariableValues'「錯誤?我是新來的Objective-C,但我想這意味着它沒有看到我的聲明。但我不確定它是否是語法/格式問題,因爲我對這門語言很陌生。

回答

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]; 
+0

這樣做了!謝謝! – 2013-02-25 00:42:51

+1

或者你可以做'[self.brain.class classMethod]' – Sebastian 2013-02-25 00:50:31

3

「+」符號表示類方法。你可以通過你的類名來訪問它,而不是它的一個實例。

[MyClass methodName]; 

一個 「 - 」 號表示實例方法。你可以通過你的類(的實例已經分配-inited之後訪問它。

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

[myInstance methodName]; 
2

MOXY是正確的。

+ (double)evaluateExpression: (id)anExpression; 

是一個類方法,並被髮送到類。通常使用類方法的東西像構建新的對象:

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

你需要的是一個實例方法:

- (double) evaluateExpression: (id) anExpression; 

,您將發送到您的實例對象上。

相關問題