我使用Objective C在Xcode中编写计算器进行学习(我是初学者)。这尤其是我正在使用的代码(用于计算NSString)。
- (IBAction)resultButtonPressed:(id)sender {
NSExpression *expression = [NSExpression expressionWithFormat:label_result.text];
label_result.text = [NSString stringWithFormat:@"%@", [expression expressionValueWithObject:nil context:nil]];
}
问题在于,每当用户输入“不可计算的”内容时,喜欢' 6(5 + 1)'而不是' 6 *(5 + 1)',程序崩溃了,我得到了这个:
2014-11-01 02:36:10.577 The Calculator[1515:575020] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "6(5+1) == 1"'
*** First throw call stack:
(0x18672de48 0x196e280e4 0x18753ad98 0x187538e2c 0x18764b128 0x18764b0c4 0x100062244 0x18af110f8 0x18aefa22c 0x18af10a94 0x18af10720 0x18af09c74 0x18aedd38c 0x18b17c1b4 0x18aedb8f4 0x1866e60e8 0x1866e538c 0x1866e343c 0x1866111f4 0x18f7a75a4 0x18af42784 0x10006286c 0x197496a08)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
所以在过去的半小时里我一直在搜索一个方法/函数,它允许你首先检查 NSString是否可以计算,这样我就可以(如果需要)创建一个警告标签或类似的东西,但我找不到。有没有人可以帮助我?
谢谢!
答案 0 :(得分:5)
NSExpression
并非旨在成为错误检测,用户可更正的表达式解析器。开发人员可以使用它来评估确保正确形成的表达式。也没有内置API来实现这一目标。
您必须在其他地方查找具有用户友好错误处理的表达式解析器。鉴于表达式解析是一个典型的Comp Sci 101问题,谷歌搜索“C数学表达式解析器”或“iOS数学表达式解析器”或任何其他几十个关键字汤组合将产生代码和讨论。
注意:不要打扰异常捕获路径。 iOS / OS X中的例外仅用于表示程序员错误,并且不能被设计为可恢复。
答案 1 :(得分:2)
试试吧!
@try {
NSExpression *expression = [NSExpression expressionWithFormat:label_result.text];
label_result.text = [NSString stringWithFormat:@"%@", [expression expressionValueWithObject:nil context:nil]];
} @catch (NSException *exception) {
if ([[exception name] isEqualToString:NSInvalidArgumentException]) {
label_result.text = @"Invalid Expression";
}
注意:在Cocoa中不推荐尝试/捕获异常。异常应该用于意外错误。 您也可以使用像这样的数学解析器https://github.com/davedelong/DDMathParser。 抱歉我的英语,我是法国人。
答案 2 :(得分:0)
如果您想使用它,我的计算器中有一个方法可以完成您想要实现的目标。
https://github.com/iMillJoe/Calc7.2.1
请参阅IMCalculatorBrain(和IMShunting Token),计算器采用NSString表达式,并返回带有数字或语法错误的NSString。语法围绕TI图形计算器设计。