1

重複の可能性:
モデル クラスのプロパティに割り当てられた値がビュー/コントローラー クラスで消える

これは、「タイプ y のオブジェクトにプロパティ x が見つかりません」というエラーについてのフォローアップです。これが質問の完全版です。XCode のバグではなく、自分の間違いであることを本当に望んでいます。なぜなら、私はこれに非常に慣れておらず、学習に役立つエラーに依存しているためです。

問題は、(IBAction)testPressedというプロパティを使用する CalculatorViewController.m (コードが続きます) で呼び出されるメソッドにありますwhatHappenedSinceLastClear。そのプロパティは CalculatorBrain.m のインターフェイスで宣言され、実装で合成されますが、 の行で(IBAction)testPressedエラーがNSMutableArray *program = brain.whatHappenedSinceLastClear;発生しますproperty 'whatHappenedSinceLastClear' not found on object of type 'CalculatorBrain *'.

以前の投稿への回答で 1 人のポスターが示唆したように、CalculatorBrain.h で 'whatHappenedSinceLastClear' を宣言すると、エラーはなくなりますが、別のポスターは、違いは生じないはずであり、これは単なる回避策であると指摘しました。stackoverflow をいじった後、クリーニングを試み、派生データを削除しようとしましたが、それでもエラーが発生します。

これが私の(非常に未完成の)コードです。私が知っているメソッドのいくつかは、長さのために切り取られています。

CalculatorViewController.h

#import <UIKit/UIKit.h>

@interface CalculatorViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *display;
@property (weak, nonatomic) IBOutlet UILabel *history;

@end

CalculatorViewController.m (いくつかの明らかに重要でないメソッドが省略されています)

#import "CalculatorViewController.h"
#import "CalculatorBrain.h"

@interface CalculatorViewController ()
@property (nonatomic) BOOL userIsEnteringNumber;
@property (nonatomic) BOOL numberIsNegative;
@property (nonatomic,strong) CalculatorBrain *brain;
@property (nonatomic) NSArray *arrayOfDictionaries;
@property (nonatomic) NSDictionary *dictionary;
@end

@implementation CalculatorViewController
@synthesize display = _display;
@synthesize history = _history;
@synthesize userIsEnteringNumber = _userIsEnteringNumber;
@synthesize numberIsNegative;
@synthesize brain = _brain;
@synthesize arrayOfDictionaries;
@synthesize dictionary;

-(CalculatorBrain *)brain
{
if (!_brain) _brain = [[CalculatorBrain alloc] init];
return _brain;
}

- (IBAction)digitPressed:(UIButton *)sender 
{
NSString *digit = sender.currentTitle;
//self.display.text = @"0";
//Enter digit if it wouldn't create a two-decimal-point case.
NSRange range = [self.display.text rangeOfString:@"."];
if (range.location==NSNotFound || (![digit isEqualToString:@"."]))
{
    if (self.userIsEnteringNumber)
    {
        self.display.text = [self.display.text stringByAppendingString:digit];
        self.history.text = [self.display.text stringByAppendingString:@" "];
    }
    else 
    {
        self.history.text = [self.history.text stringByAppendingString:digit];
        self.history.text = [self.history.text stringByAppendingString:@" "];
        if (![sender.currentTitle isEqualToString:@"."])
        {
            self.display.text = digit;
        }
        else 
        {

        }
        self.userIsEnteringNumber = YES;
    }
}
}

- (IBAction)operationPressed:(UIButton *)sender 
{
NSDictionary *dict = [self loadDictionary];
if (self.userIsEnteringNumber) [self enterPressed];
NSString *operation = sender.currentTitle;
double result = [self.brain performOperation:operation];
self.display.text = [NSString stringWithFormat:@"%g",result];
self.history.text = [self.history.text stringByAppendingString:sender.currentTitle];
self.history.text = [self.history.text stringByAppendingString:@" = "];
[self.brain pushOperand:operation withDictionary:dict];
}

-(NSDictionary *)loadDictionary
{ 
NSDictionary *dict = self.dictionary;
NSArray *variableArray = [[NSArray alloc] init];
variableArray = [NSArray arrayWithObjects:@"x",@"y",@"z",@"foo",@"π",nil];
NSArray *valueArray = [[NSArray alloc] init];
valueArray = [NSArray arrayWithObjects:[NSNumber numberWithDouble:3],[NSNumber numberWithDouble:4.1],[NSNumber numberWithDouble:-6],[NSNumber numberWithDouble:8.2],[NSNumber numberWithDouble:3.14159], nil];
dict = [[NSDictionary alloc] initWithObjects:valueArray forKeys:variableArray];
return dict;
}

- (IBAction)variablePressed:(UIButton *)sender 
{
NSDictionary *dict = [self loadDictionary];
NSString *var = sender.currentTitle;
[self.brain convertVariable:var usingDictionary:dict];
self.display.text = [NSString stringWithFormat:@"%@",var];
self.history.text = [self.history.text stringByAppendingString:sender.currentTitle];
[self.brain pushOperand:[dict objectForKey:var] withDictionary:dict];
}

-(IBAction)testPressed:(id)sender
{
CalculatorBrain *brain = self.brain;   
brain = [[CalculatorBrain alloc] init];
NSMutableArray *program = brain.whatHappenedSinceLastClear;
double blah = [brain runProgram:program];
self.history.text=@"";
self.history.text=[self.history.text stringByAppendingFormat:@"%f",blah];
NSLog(@"%f",blah);
}

- (IBAction)enterPressed 
{
[self.brain pushOperand:[NSNumber numberWithDouble:[self.display.text doubleValue]] withDictionary:self.dictionary];
self.userIsEnteringNumber = NO;
}

@end

CalculatorBrain.h

#import <Foundation/Foundation.h>

@interface CalculatorBrain : NSObject

-(void)pushOperand:(id)operand withDictionary:(NSDictionary *)dictionary;
-(double)performOperation:(NSString *)operation;
-(void)clearStack;
-(void)deleteLastDigit;
-(double)convertVariable:(NSString *)variable usingDictionary:dictionaryContainingValuesYouWantToUse;
@property (readonly) id thisMeansAProgramCanGetAndSet;
+ (NSSet *)variablesUsedInProgram:(id)whatHappenedSinceLastClear;
-(double)runProgram:(id)whatHappenedSinceLastClear;
- (double)runProgram:(id)whatHappenedSinceLastClear usingVariableValues:(NSDictionary *)variableValues;
-(NSString *)descriptionOfProgram:(id)whateverSpecificProgramYouNeedToDescribe;

@end

そして CalculatorBrain.m (ここでも明らかに重要でないメソッドが省略されています)。

#import "CalculatorBrain.h"

@interface CalculatorBrain ()
-(id)copyOfWhatHappenedSinceLastClear;
@property (nonatomic, strong) NSMutableArray *whatHappenedSinceLastClear;
-(double)popOffProgramStack:(NSMutableArray *)particularStackYouNeedToPopOff;
-(double)runProgram:(id)whateverSpecificProgramYouNeedToRun;
-(NSString *)descriptionOfProgram:(id)whateverSpecificProgramYouNeedToDescribe;
@end

@implementation CalculatorBrain
@synthesize whatHappenedSinceLastClear = _whatHappenedSinceLastClear;
@synthesize thisMeansAProgramCanGetAndSet = _thisMeansAProgramCanGetAndSet;

-(id)copyOfWhatHappenedSinceLastClear
{
return [self.whatHappenedSinceLastClear copy];
}

-(double)runProgram:(id)whatHappenedSinceLastClear
{
NSMutableArray *mutableCopyOfWhatHappenedSinceLastClear;
if ([whatHappenedSinceLastClear isKindOfClass:[NSArray class]]) {
    mutableCopyOfWhatHappenedSinceLastClear = [whatHappenedSinceLastClear mutableCopy];
}
return [self popOffProgramStack:mutableCopyOfWhatHappenedSinceLastClear];
}

- (double)runProgram:(id)whatHappenedSinceLastClear usingVariableValues:(NSDictionary *)variableValues
{
return 0;
}

- (double)popOffProgramStack:(NSMutableArray *)particularStackYouNeedToPopOff
{
double result = 0;

id topOfStack = [particularStackYouNeedToPopOff lastObject];
if (topOfStack) [particularStackYouNeedToPopOff removeLastObject];

if ([topOfStack isKindOfClass:[NSNumber class]])
{
    result = [topOfStack doubleValue];
}
else if ([topOfStack isKindOfClass:[NSString class]])
{
    NSString *operation = topOfStack;
    if ([operation isEqualToString:@"+"]) {
        result = [self popOffProgramStack:particularStackYouNeedToPopOff] +
        [self popOffProgramStack:particularStackYouNeedToPopOff];
    } else if ([@"*" isEqualToString:operation]) {
        result = [self popOffProgramStack:particularStackYouNeedToPopOff] *
        [self popOffProgramStack:particularStackYouNeedToPopOff];
    } else if ([operation isEqualToString:@"-"]) {
        double subtrahend = [self popOffProgramStack:particularStackYouNeedToPopOff];
        result = [self popOffProgramStack:particularStackYouNeedToPopOff] - subtrahend;
    } else if ([operation isEqualToString:@"/"]) {
        double divisor = [self popOffProgramStack:particularStackYouNeedToPopOff];
        if (divisor) result = [self popOffProgramStack:particularStackYouNeedToPopOff] / divisor;
    }
}

return result;
}

-(NSMutableArray *)whatHappenedSinceLastClear
{
if(!_whatHappenedSinceLastClear) _whatHappenedSinceLastClear = [[NSMutableArray alloc] init];
return _whatHappenedSinceLastClear;
}

-(void)clearStack
{
self.whatHappenedSinceLastClear = [[NSMutableArray alloc] init];
}

-(void)pushOperand:(id)operand withDictionary:(NSDictionary *)dictionary
{
NSArray *operations = [[NSArray alloc] initWithObjects:@"+",@"-",@"/",@"*",@"sin",@"cos",@"√", nil];
NSNumber *operandAsNumberObject;
NSString *operationAsObject;
if (![operand isKindOfClass:[NSString class]])
{
    operandAsNumberObject = operand;
    [self.whatHappenedSinceLastClear addObject:operandAsNumberObject];
}
else if ([operations containsObject:operand])
{
    operationAsObject = operand;
    [self.whatHappenedSinceLastClear addObject:operationAsObject];
}
else 
{
    operandAsNumberObject = [dictionary objectForKey:operand];
    [self.whatHappenedSinceLastClear addObject:operandAsNumberObject];
}
}

-(double)popOperand
{
NSNumber *operandAsObject = [self.whatHappenedSinceLastClear lastObject];
if (operandAsObject) [self.whatHappenedSinceLastClear removeLastObject];
return [operandAsObject doubleValue];
}

- (double)performOperation:(NSString *)operation
{
[self.whatHappenedSinceLastClear addObject:operation];
return [self runProgram:self.copyOfWhatHappenedSinceLastClear];
//when it was a class method code was:  return [[self class] runProgram:self.copyetc.]
}

@end

それで、何が起こっているのかを説明できる何か(それが基本的でばかげた間違いだと指を交差させた)を見ている人はいますか?

4

0 に答える 0