Objective C 新手
Posted
技术标签:
【中文标题】Objective C 新手【英文标题】:Objective C newbie 【发布时间】:2012-02-28 02:56:18 【问题描述】:我正在上课,我们正在开发一个计算器程序。我的背景是 C++。我正在使用 3 输入 sqrt 的 RPN 计算器条目,并且需要在我的 descriptionOfProgram 方法中将其显示为 sqrt(3),这是新的,包括下面的关联属性。这是到目前为止的课程。搜索“xcode”以查找我的问题。有任何想法吗?我不太擅长基本的目标c课程,但我正在努力学习。总结如下:
-
它在抱怨我的布尔值。我不确定为什么。我在另一个班级做过这个,效果很好。
它正在寻找一个我没看到它
它不喜欢我使用密钥。我不清楚如何获取我认为是问题的密钥内容。
它想要 ] 但我不明白为什么
已跳过
应该是 在@end
希望您能提供帮助!谢谢!
//
// CalculatorBrain.m
// Calculator
//
// Created by Michele Cleary on 2/25/12.
// Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import "CalculatorBrain.h"
@interface CalculatorBrain()
@property (nonatomic, strong) NSMutableArray *programStack;
@property (nonatomic, strong) NSDictionary *testVariable;
@property (nonatomic) BOOL numberHandledNextOperation;
- (double) convertRadianToDegree: (double) radian;
@end
@implementation CalculatorBrain
@synthesize programStack = _programStack;
@synthesize testVariable = _testVariable;
@synthesize numberHandledNextOperation = _numberHandledNextOperation;
- (NSMutableArray *)programStack
if (_programStack == nil) _programStack = [[NSMutableArray alloc] init];
return _programStack;
//- (void)setOperandStack:(NSMutableArray *)operandStack
//
// _operandStack = operandStack;
//
- (void)pushOperand:(double)operand
[self.programStack addObject:[NSNumber numberWithDouble:operand]];
- (double)performOperation:(NSString *)operation
[self.programStack addObject:operation];
return[CalculatorBrain runProgram:self.program];
- (id)program
return [self.programStack copy];
+ (NSString *)descriptionOfProgram:(id)program
self.numberHandledNextOperation = NO; //1. this is a problem with xcode: member reference type struct objc_class * is a pointer; maybe you meant to use ->
NSMutableSet * displayDescrip = [[NSMutableSet alloc] init];
for(id foundItemKey in program)
if ([foundItemKey isKindOfClass:[NSString class]])
//operator or variable
if ([foundItemKey isEqualToString:@"sin"]&&(!self.numberHandledNextOperation))
//2. xcode says To match this .
NSObject *nextObj = [program objectForKey:(foundItemKey+1); //3. xcode doesn't like this: arithmetic on pointer to interface id which is not a constant size in non-fragile ABI
//[displayDescrip addObject:foundItemKey];
else if ([foundItemKey isEqualToString:@"cos"])
//[displayDescrip addObject:foundItemKey];
else if ([foundItemKey isEqualToString:@"sqrt"])
//[displayDescrip addObject:foundItemKey];
else if ([foundItemKey isEqualToString:@"Ï€"])
//[displayDescrip addObject:foundItemKey];
else if (![CalculatorBrain isOperationName:foundItemKey])
//variable
//[displayDescrip addObject:foundItemkey];
else if (foundItemKey isKindOfClass:[NSNumber class]) //4. xcode expected ]
//number
//if next object is operation
if(isOperation([program objectForKey:(foundItemKey+1)))
numberHandledNextOperation = YES;
if(isOperationSpecial([program objectForKey:(foundItemKey+1)))
//sin or cos or sqrt need parentheses
//[displayDescrip addObject:(foundItemKey+1)];
//[displayDescrip addObject:@"("];
//[displayDescrip addObject:foundItemKey];
//[displayDescrip addObject:@")"];
else
//regular operation + - / *
//[displayDescrip addObject:(foundItemKey+1)];
//[displayDescrip addObject:(foundItemKey)];
numberHandledNextOperation = YES;
//if
//else if
//if
//for
//not sure if I need this next thing
//NSSet * returnedVarNames = [varNames copy];
//return returnedVarNames;
return @"implement this in Assignment 2";
+ (double)runProgram:(id)program
NSMutableArray *stack;
if ([program isKindOfClass:[NSArray class]])
stack = [program mutableCopy];
return [self popOperandOffStack:stack];
+ (double)runProgram:(id)program usingVariableValues:(NSDictionary *)variableValues
NSMutableArray *stack;
if ([program isKindOfClass:[NSArray class]])
stack = [program mutableCopy];
if(variableValues)
int numItemsDisplayed = [stack count];
for (int count = 0; count < numItemsDisplayed; count++)
id foundItem = [stack objectAtIndex:count];
if ([foundItem isKindOfClass:[NSString class]])
NSString * var = [variableValues objectForKey:foundItem];
if(var)
[stack replaceObjectAtIndex:count withObject:[NSNumber numberWithDouble:[var doubleValue]]];
return [self popOperandOffStack:stack];
+ (double)popOperandOffStack:(NSMutableArray *)stack
double result = 0;
id topOfStack = [stack lastObject];
if (topOfStack) [stack removeLastObject];
if([topOfStack isKindOfClass:[NSNumber class]]) //number
result = [topOfStack doubleValue];
else if ([topOfStack isKindOfClass:[NSString class]]) //string operation
NSString *operation = topOfStack;
if ([operation isEqualToString:@"+"])
result = [self popOperandOffStack:stack] + [self popOperandOffStack:stack];
else if ([operation isEqualToString:@"*"])
result = [self popOperandOffStack:stack] * [self popOperandOffStack:stack];
else if ([operation isEqualToString:@"/"])
double divisor = [self popOperandOffStack:stack];
if (divisor)
result = [self popOperandOffStack:stack] / divisor;
else if ([operation isEqualToString:@"-"])
double subtrahend = [self popOperandOffStack:stack];
result = [self popOperandOffStack:stack] - subtrahend;
else if ([operation isEqualToString:@"sin"])
result = result = (sin([self popOperandOffStack:stack])); //(sin([self convertRadianToDegree:[self popOperandOffStack:stack]]));
else if ([operation isEqualToString:@"cos"])
result = (cos([self popOperandOffStack:stack]));
else if ([operation isEqualToString:@"sqrt"])
result = (sqrt([self popOperandOffStack:stack]));
else if ([operation isEqualToString:@"π"])
result = M_PI;
else
result = 0;
return result;
+ (NSSet *)variablesUsedInProgram:(id)program
NSMutableSet * varNames = [[NSMutableSet alloc] init];
for(id foundItem in program)
if ([foundItem isKindOfClass:[NSString class]])
if (![CalculatorBrain isOperationName:foundItem])
[varNames addObject:foundItem];
NSSet * returnedVarNames = [varNames copy];
return returnedVarNames;
+ (BOOL)isOperationName:(NSString *)foundItem
NSSet *myOperationSet = [NSSet setWithObjects:@"sqrt", @"sin", @"cos", @"π", @"+", @"-", @"*", @"/", nil];
return([myOperationSet containsObject:(foundItem)]);
- (NSString *)description
return [NSString stringWithFormat:@"stack = %@", self.programStack];
-(double) convertRadianToDegree: (double) radian;
return M_PI*2*radian/360;
@end //6. xcode expected
【问题讨论】:
欢迎来到 Stack Overflow。当成员发布具有特定答案的完整问题时,该网站效果最佳。您是否尝试在 Stack Overflow 上搜索您看到的错误或警告? 【参考方案1】:+ (NSString *)descriptionOfProgram:(id)program
你真的想要descriptionOfProgram
一个类+
方法吗?如果是,它更像是 C++ 中的静态方法。它不属于某个类的任何特定实例。没有传递指向当前实例的常量指针的隐藏参数。
【讨论】:
其实,在类方法中使用self
is,它只是不指向类的实例,而是指向类本身。以上是关于Objective C 新手的主要内容,如果未能解决你的问题,请参考以下文章
Objective C NSAutoreleasePool 和发布
Objective C 相当于 Swift addConstraints?