0

インポートされたヘッダーファイルで定義されているクラスメソッドを呼び出そうとしています。

以下のコードを実行すると、「double * result=...」行のビューで次のエラーが発生します。

+[CalculatorBrain runProgram:usingVariableValues:]: unrecognized selector sent to class 0x6908

** CalculatorViewController.m **

#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]];

}

** CalculatorBrain.h **

#import <UIKit/UIKit.h>

@interface CalculatorBrain : NSObject

+ (double *)runProgram:(id)program usingVariableValues:(NSDictionary *)variableValues;

@property (readonly) id program;


@end

** CalculatorBrain.m **

#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];
}
4

1 に答える 1

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*


ヘッダーには署名があります:

+ (double *)runProgram:(id)program usingVariableValues:(NSDictionary *)variableValues;

あなたの実装は

+ (double)runProgram:(id)program :(NSDictionary *) usingVariableValues 

それらは同一ではありません:

  1. ヘッダーは、返されるdoubleへのポインターを約束します。あなたはそれを望まない。

  2. 彼らは同じ名前を持っていません +runProgram:usingVariableValues:vs+runProgram::

于 2012-10-24T02:39:13.797 に答える