0

私はObjective-cを初めて使用するので、スタンフォード大学のCS193s2010Fセッションの講義/課題に取り組むことから始めることにしました。

2番目の割り当てに取り組んでいて、NSMutableArray内のすべての文字列を結合(連結)するNSStringを返さなければならないときに行き詰まりました。(MutableArrayは、各インデックスでNSStringのみで構成されます)

私のアプローチは、forループを使用してMutableArrayのインデックスを通過させることでした(以下のコードでは、MutableArrayはタイプ「id」の「anExpression」です)。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;
}

そしてそれは今動作します。

2番目のコードが機能するのに、最初のコードが機能しない理由がわかりません。文字列の追加は、nilが渡された場合にのみ失敗(およびクラッシュ)すると思いました...

足りないものはありますか?

前もって感謝します :)

4

3 に答える 3

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 に答える
1

anExpression の内容は、NSString ではなく NSNumber のインスタンスのようです。あなたが得ているエラーは、appendString がどのように機能するかについてのヒントです。最初のステップは、渡された「文字列」の長さを確認することです (おそらく、十分なメモリを割り当てることができます)。これは明らかに NSNumber のメソッドではなく (したがってクラッシュします)、stringWithFormat型チェックを行い、より柔軟になるように設計されています。

同様に使用できると思いますstringValue

[result appendString:[[anExpression objectAtIndex:i] stringValue]];
于 2012-07-17T06:13:51.863 に答える
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 に答える