Stanford iOS之calculator(1)
CalculatorBrain.h
/建model------菜单 > NewFile > iOS
> Cocoa Touch > Objective-C class
//
完成操作数入栈和完成栈上的操作
#import <Foundation/Foundation.h>
@interface CalculatorBrain : NSObject
-(void)pushOperand:(double)operand;
-(double)performOperation:(NSString *)operation;
@end
CalculatorBrain.m
//这就是model,接受操作数,返回运算结果
#import "CalculatorBrain.h"
@interface CalculatorBrain() //private的
@property(nonatomic,strong)NSMutableArray *operandStack; //一定要是strong,因为只有我们在使用这个指针,strong会告诉 @end //编译器怎么管理内存,当property创建时值为0或者nil,发消息给nil什么也不发生
//提问:如果不用nonatomic会怎样?会有警告。因为重载了getter但没重载setter,但是又要锁线程,所以给你一个警告。
@implementation CalculatorBrain
@synthesize operandStack=_operandStack; //@synthesize不会生成getter了,因为底下我们自己实现了
//提问:synthesize会自动分配空间吗?不会,synthesize只有一个变量指针,需要你来分配空间
-(NSMutableArray *)operandStack //NSMutableArray的getter方法实现:如果operandStack为空那就分配一个数组 { //现在这个operandStack不可能是nil了
if(_operandStack==0)
_operandStack=[[NSMutableArray alloc] init]; //lazy instantiation 延迟实例化,在iOS里经常用到
return _operandStack;
} //没有用setter,因为没有特殊的事情要做
-(double)popOperand
{
NSNumber *operandObject=[self.operandStack lastObject]; //NSMutableArray的实例方法lastObject。
//lastObject是数组最后一个对象的指针而不是一个副本
if (operandObject) //如果对空数组做移除操作,不是nil是空,程序会崩溃 。前面的lastObject不会崩溃但removeLastObject会崩溃 [self.operandStack removeLastObject]; //NSMutableArray的实例方法removeLastObject
return [operandObject doubleValue]; //NSNumber解封(开箱unboxing)doubleValue。
}
-(void)pushOperand:(double)operand
{
[self.operandStack addObject:[NSNumber numberWithDouble:operand]];
//NSNumber封装(装箱boxing)numberWithDouble及NSMutableArray的实例方法addObject。
// 如果property创建operandStack的值为nil,此步什么也不发生。
//为了避免此情况,要用构造函数设置operandStack,本例这个设置在getter里执行。
}
-(double)performOperation:(NSString *)operation
{
double result=0;
if ([operation isEqualToString:@"+"]) //NSString的实例方法isEqualToString
{ result=[self popOperand]+[self popOperand]; }
else if([@"*" isEqualToString:operation])
{ result=[self popOperand]*[self popOperand]; }
else if([@"-" isEqualToString:operation])
{ result=[self popOperand]-[self popOperand]; }
else if([@"/" isEqualToString:operation])
{ result=[self popOperand]/[self popOperand]; }
[self pushOperand:result]; //把结果压回到栈上,因为要继续操作
return result;
}
@end
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。