我正在尝试使用控制台线计算器,我的程序出现问题。我调用一个方法(startParsing)并传递用户输入。我的方法在第一次迭代期间工作(当i = 0时)并且它在我的数字属性中添加一个数字(在我的.h文件中是@property(非原子,强)NSMutableString *数字)并且向NSMutableArray添加一个运算符。因此,如果我传递2 + 3 + 7,则该方法将“2”添加到数字属性,将“+”添加到运算符数组。然后第二次迭代开始,当这行被调用时[self.number appendFormat:@“%c”,symbol];出现错误: 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'尝试使用appendFormat:'来改变不可变对象。'。
请你帮我一点,了解什么是错的,以及如何解决它?
- (void)startParsing:(NSMutableString *)userInput {
int operatorCounter = 1;
for (int i = 0; i < [userInput length]; i++)
{
char symbol = (char) [userInput characterAtIndex:(NSUInteger) i];
if ([self isSymbolNumber:symbol])
{
[self.number appendFormat:@"%c", symbol];
operatorCounter = 0;
}
else
{
if ([self isOperatorSymbol:symbol])
{
//checks if the symbol is a unary operator.
if ((symbol == '-' || symbol == '+') && ([self isSymbolNumber:(char) [userInput characterAtIndex:(NSUInteger) i + 1]])
&& (operatorCounter == 1))
{
[self.number appendFormat:@"%c", symbol];
operatorCounter = 0;
}
else if (operatorCounter == 0)
{
[self convertNumberToIntAndAddToArray:self.number];
NSMutableString *singleCharacter = [NSMutableString stringWithFormat:@"%c", symbol];
[self.arrayOfOperators addObject:singleCharacter];
operatorCounter++;
}
else [self printErrorWith:@"Invalid input operatorCounter == 0 "];
}
else
{
[self printErrorWith:@"Invalid input operatorCounter == 0 below"];
}
}
}
答案 0 :(得分:1)
首先,使用char作为&#34; characterAtIndex&#34;的结果。太可怕了。 char是8位,characterAtIndex是16位。只要有任何非ASCII字符,事情就会出错。
self.number很可能是一个不可变的字符串(NSString),因此尝试将char附加到它不会起作用。以&#34; stringBy&#34;开头的方法创建并返回一个新字符串;寻找合适的东西。