布局方面
学习masonry以来还是第一次使用masonry布局,加上有一阵子没有认真敲代码了,布局也算是我的第一个坎
关于masonry使用的具体讲解在这篇文章
button点击事件
之前一直都是一个一个的给button加点击事件,但计算器按钮很多,一个一个添加会使代码有很多废话,从学长的代码里学会使用循环加事件
for (DeepButton *button in _myView.buttonArr) {
[button addTarget:self action:@selector(press:) forControlEvents:UIControlEventTouchUpInside];
}
算法
写计算器时算法的短板很快就暴露出来了,数据结构课还是得认真听。。栈的基本使用都相当于初学,一点一点的查资料才开始入门。具体代码在这篇博客
MVC
这也是我第一次使用MVC写项目,写之前学长也叮咛过许多,也就没有碰到特别过不去的坎,感觉没有使用到MVC的精髓,只是单纯的将一个文件分成了三个文件去写,KVO,通知,协议都没有用到。
输入合法问题
因为计算器对表达式有一定的限制,比如:2+*,)(,6+)等都是不合法的,需要加一些限制条件,这里我想到一点就加一点限制,写的比较乱
直接按等于号处理
if ([_getStr isEqualToString: @""]) {
_myView.showTextField.text = @"格式错误!";
return ;
}
括号匹配及符号不合法问题
for (int i = 0; i < _getStr.length; i++) {
int flag1 = 0;
int flag2 = 0;
char shortStr;//遍历到的字符
char nextStr = '\0';//下一个字符
shortStr = [_getStr characterAtIndex:i];
NSLog(@"shortStr == %c", shortStr);
if (i != _getStr.length - 1) {
nextStr = [_getStr characterAtIndex:i + 1];
NSLog(@"nextStr == %c", nextStr);
}
//括号匹配问题
if (shortStr == '(') {
m++;
}
if (shortStr == ')') {
m--;
}
if (m < -1) {
_myView.showTextField.text = @"格式错误!";
return ;
}
//找出运算符
for (int j = 0; j < 7; j++) {
if (opset[j] == shortStr) {
flag1 = 1;
}
if (opset[j] == nextStr) {
flag2 = 1;
}
}
//连着两个都是运算符
if (flag2 == 1 && flag1 == 1) {
_myView.showTextField.text = @"格式错误!";
return ;
}
}
//括号不匹配
if (m != -1) {
_myView.showTextField.text = @"格式错误!";
return ;
}
.2+3 类问题
如果直接使用.2会出错。我加了一个判断,如果.之前没有数字,则补0
NSString *firstString = [_getStr substringFromIndex:0];
NSLog(@"firstString == %@", firstString);
if ([firstString isEqual: @""]) {
[_getStr appendFormat:@"0"];
}
9*(-0.2)类问题
这个式子是没有问题的,但是我们的算法在执行过程中将符号认为是运算符,让9从数字栈中弹出,再次进行运算时已经没有数字可以取出了,默认返回值时0,0乘以任何数就都是0了
这里我的处理方法是立个flag = 0来标记是否有负数,如果碰见负数则不存入符号,即传入的计算式为9*(0.2),当flag = 1时,answer = -answer
if (_getStr.length >= 1) {
NSString *frontString = [_getStr substringFromIndex:_getStr.length - 1];
if ([frontString isEqual:@"("]) {
_negativeFlag = 1;
NSLog(@"no!");
[_showStr appendFormat:@"-"];
} else {
NSLog(@"-");
[_getStr appendString:@"-"];
[_showStr appendString:@"-"];
}
} >= 1) {
NSString *frontString = [_getStr substringFromIndex:_getStr.length - 1];
if ([frontString isEqual:@"("]) {
_negativeFlag = 1;
NSLog(@"no!");
[_showStr appendFormat:@"-"];
} else {
NSLog(@"-");
[_getStr appendString:@"-"];
[_showStr appendString:@"-"];
}
}
按 = 出答案后,清空计算式
if (_myModel.answer) {
_myView.showTextView.text = @"";
[_getStr setString:@""];
[_showStr setString:@""];
_myModel.answer = NULL;
}