我正在尝试调用导入的头文件中定义的类方法。
当我运行下面的代码时,我在“double * result = ...”行的视图中收到此错误:
+[CalculatorBrain runProgram:usingVariableValues:]: unrecognized selector sent to class 0x6908
#import "CalculatorViewController.h"
#import "CalculatorBrain.h"
@interface CalculatorViewController()
@property (nonatomic, strong) CalculatorBrain *brain;
@property (nonatomic, strong) NSMutableDictionary *variableValues;
@end
@implementation CalculatorViewController
@synthesize brain = _brain;
@synthesize variableValues = _variableValues;
- (CalculatorBrain *)brain {
if (!_brain) _brain = [[CalculatorBrain alloc] init];
return _brain;
}
- (NSMutableDictionary *)variableValues {
if (!_variableValues) {
_variableValues = [[NSMutableDictionary alloc] init];
}
return _variableValues;
}
- (IBAction)enterPressed {
double *result = [CalculatorBrain runProgram:[self.brain program] usingVariableValues:[self variableValues]];
}
#import <UIKit/UIKit.h>
@interface CalculatorBrain : NSObject
+ (double *)runProgram:(id)program usingVariableValues:(NSDictionary *)variableValues;
@property (readonly) id program;
@end
#import "CalculatorBrain.h"
@interface CalculatorBrain()
@property (nonatomic, strong) NSMutableArray *programStack;
@end
@implementation CalculatorBrain
@synthesize programStack = _programStack;
... other code ...
+ (double)runProgram:(id)program :(NSDictionary *) usingVariableValues
{
NSLog(@"variableValues is %@", usingVariableValues);
NSMutableArray *stack;
if ([program isKindOfClass:[NSArray class]]) {
stack = [program mutableCopy];
NSLog(@"runProgram");
// if vars are passed in
if ([usingVariableValues isKindOfClass:[NSDictionary class]]) {
NSLog(@"vars are passed in: %@", usingVariableValues);
id obj;
int index = 0;
NSEnumerator *enumerator = [program objectEnumerator];
// for every obj in programStack
while ((obj = [enumerator nextObject])) {
id varVal = [usingVariableValues objectForKey:(obj)];
// test
NSLog(@"usingVariableValues objectForKey:(obj) is %@", varVal);
// if the obj is a variable key
if (!varVal) {
varVal = 0;
NSLog(@"varVal is false");
}
NSLog(@"Replacing object at index %@ of stack with var %@", index, varVal);
// replace the variable with value from usingVariableValues OR 0
[stack replaceObjectAtIndex:(index) withObject:varVal];
index += 1;
}
}
}
return [self popOperandOffStack:stack];
}
答案 0 :(得分:1)
+ (double *)runProgram:(id)program usingVariableValues:(NSDictionary *)variableValues;
被定义为类方法,但您将其称为对象方法
double *result = [self.brain runProgram:[self.brain program] usingVariableValues:[self variableValues]];
要在课程上调用它:
double *result = [[self.brain class] runProgram:[self.brain program] usingVariableValues:[self variableValues]];
或者
double *result = [CalculatorBrain runProgram:[self.brain program] usingVariableValues:[self variableValues]];
您更改了代码,表明仍未找到该方法。你实现了吗?
如果它已实现,那么您可能必须在Xcode中将实现文件(也称为.m)添加到目标。
顺便说一下:可能你希望你的方法返回一个double
而不是double*
,一个指向双精度的指针。
你的标题有一个签名:
+ (double *)runProgram:(id)program usingVariableValues:(NSDictionary *)variableValues;
虽然您的实施已经
+ (double)runProgram:(id)program :(NSDictionary *) usingVariableValues
它们不完全相同:
标头会指向要返回的double的指针。你不希望这样。
他们甚至没有相同的名字
+runProgram:usingVariableValues:
vs +runProgram::