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++ 中的静态方法。它不属于某个类的任何特定实例。没有传递指向当前实例的常量指针的隐藏参数。

【讨论】:

其实,在类方法中使用selfis,它只是不指向类的实例,而是指向类本身。

以上是关于Objective C 新手的主要内容,如果未能解决你的问题,请参考以下文章

Objective C NSAutoreleasePool 和发布

Objective c iOS 传递数据

Objective C 相当于 Swift addConstraints?

Objective - C 如何使用 View Controller iphone 管理多个视图

内存管理基础 - Objective C

将按钮禁用为灰色-Objective C