2

私は約 1 週間前に Objective-C プログラミングを開始し、関数に渡された文字列の配列から新しい文字列を作成することに行き詰まっています。私はこれを徹底的に調査しましたが、このエラーをスローせずにstringByAppendingString1回使用できる理由を理解できないようです( で確認)が、2回目は使用できません:NSLog

ご覧いただきありがとうございます。

2012-06-29 20:46:35.761 Calculator[32883:f803] -[__NSCFNumber stringByAppendingString:]: インスタンス 0x6e43d50 に送信された認識されないセレクター

2012-06-29 20:46:35.763 Calculator[32883:f803] *キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了します。理由: '-[__NSCFNumber stringByAppendingString:]: 認識されないセレクターがインスタンス 0x6e43d50 に送信されました'

+ (NSString *)descriptionOfTopOfStack:(NSMutableArray *)stack
{
    NSString *result;
    NSString *displayString = [[NSString alloc]init];
    id topOfStack = [stack lastObject];
    if (topOfStack) [stack removeLastObject];

    if ([self isNoOperandOperation:topOfStack]) {
        displayString = [displayString stringByAppendingString:topOfStack];
        result = displayString;
        }
    else if ([self isOperation:topOfStack]){
        id nextInStack = [stack lastObject];
        if (topOfStack) [stack removeLastObject];
        displayString = [displayString stringByAppendingString:nextInStack];
        displayString = [displayString stringByAppendingString:topOfStack];
        result = displayString;
4

2 に答える 2

1

stringByAppendingString は NSString のメソッドです。displayString を NSString として返す必要があります。

+ (NSString *)descriptionOfTopOfStack:(NSMutableArray *)stack
{
NSLog(@"stack array :: %@",stack);
NSString *result;
NSString *displayString = [[NSString alloc]init];
id topOfStack = [stack lastObject];
if (topOfStack) [stack removeLastObject];

NSLog(@"topOfStack :: %@", (NSString*)topOfStack);

if ([self isNoOperandOperation:topOfStack]) {
    displayString = [[(NSNumber*)displayString stringValue] 
                                stringByAppendingString:(NSString*)topStack];
    result = displayString;
    }
else if ([self isOperation:topOfStack]){
    id nextInStack = [stack lastObject];
    if (topOfStack) [stack removeLastObject];
    displayString = [[(NSNumber*)displayString stringValue] 
                                stringByAppendingString:(NSString*)nextInStack];
    displayString = [[(NSNumber*) displayString stringValue] 
                                stringByAppendingString:(NSString*)topStack];
    result = displayString;

編集: stringByAppendingString メソッドには NSString のパラメーター タイプが必要です。topOfStack はタイプ ID です。topOfStack が文字列であると仮定して、これを NSString に型キャストする必要があります。nextInStack と同じです。

于 2012-06-30T04:05:38.097 に答える
0

id最初にあなたを文字列に変換する必要があります。NSNumbers には、 を使用できます-stringValue

于 2012-06-30T04:05:50.730 に答える