0

我是 Objective-c 的新手,我决定从斯坦福的 CS193s 2010F Session 的讲座/作业开始。

我正在处理第二个任务,当我不得不返回一个组合(连接)NSMutableArray 中的每个字符串的 NSString 时,我陷入了困境。(MutableArray 在其每个索引处仅包含 NSString)

我的方法是使用 for 循环来传递 MutableArray 的索引(在下面的代码中,MutableArray 是 'anExpression' 类型为 'id')。我声明了一个 NSMutableString 并在“anExpression”数组的每个索引处添加了 NSString。这是代码:

+ (NSString *)descriptionOfExpression:(id)anExpression{
  NSMutableString *result = [NSMutableString string];

  for (int i = 0;i<[anExpression count];i++){
    [result appendString:[anExpression objectAtIndex:i]];
  }

  return result;
}

然而,在

 [result appendString:[anExpression objectAtIndex:i]];

xcode 崩溃并出现以下错误语句:

2012-07-17 01:44:51.014 Calculator[9470:f803] -[__NSCFNumber length]: unrecognized selector sent to instance 0x68732c0
2012-07-17 01:44:51.015 Calculator[9470:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber length]: unrecognized selector sent to instance 0x68732c0'
*** First throw call stack:
(0x13ca022 0x155bcd6 0x13cbcbd 0x1330ed0 0x1330cb2 0x12d2d18 0x13460d7 0x1397a8d 0x3a50 0x27ed 0x13cbe99 0x1714e 0x170e6 0xbdade 0xbdfa7 0xbd266 0x3c3c0 0x3c5e6 0x22dc4 0x16634 0x12b4ef5 0x139e195 0x1302ff2 0x13018da 0x1300d84 0x1300c9b 0x12b37d8 0x12b388a 0x14626 0x1ed2 0x1e45 0x1)
terminate called throwing an exception

我查看了苹果的开发者文档,看到了 'NSString stringWithFormat:' 方法,并决定改用这个方法:

+ (NSString *)descriptionOfExpression:(id)anExpression{
  NSMutableString *result = [NSMutableString string];

  for (int i = 0;i<[anExpression count];i++){
    [result appendString:[NSString stringWithFormat:@"%@",[anExpression objectAtIndex:i]]];
  }

  return result;
}

现在可以了。

现在我很困惑为什么第二个代码有效但第一个无效。我认为附加字符串只有在通过 nil 时才会失败(并崩溃)......

有什么我想念的吗?

先感谢您 :)

4

3 回答 3

1

看起来 anExpression 的内容是 NSNumber 而不是 NSString 的实例。您得到的错误是关于 appendString 如何工作的提示;第一步显然是询问传递的“字符串”有多长(大概是为了分配足够的内存)。这显然不是 NSNumber 上的方法(因此崩溃),stringWithFormat旨在进行类型检查并更灵活。

我怀疑你也可以使用stringValue

[result appendString:[[anExpression objectAtIndex:i] stringValue]];
于 2012-07-17T06:13:51.863 回答
1
+ (NSString *)descriptionOfExpression:(id)anExpression{

      NSMutableString *result = [NSMutableString string];

          for (int i = 0;i<[anExpression count];i++) {

              [result appendString:[[anExpression objectAtIndex:i] stringValue]];

         }

  return result;
}

将其转换为字符串会对您有所帮助!

于 2012-07-17T06:21:25.997 回答
0

使用这个功能:

+ (NSString *)descriptionOfExpression:(id)anExpression
{
     NSMutableString *result = [[NSMutableString alloc] init];

    for (int i = 0;i<[anExpression count];i++)
    {
        NSString *str = [NSString stringWithFormat:@"%@",[anExpression objectAtIndex:i]]; 

        if(str)
        { 
            [result appendString:str];
        }

        //OR
        //[result appendFormat:[NSString stringWithFormat:@"%@",[anExpression objectAtIndex:i]]]; 

    }

    return result;
}
于 2012-07-17T06:13:14.740 回答