これは、「タイプ 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
それで、何が起こっているのかを説明できる何か(それが基本的でばかげた間違いだと指を交差させた)を見ている人はいますか?