読者です 読者をやめる 読者になる 読者になる

定食屋おろポン

おろしポン酢と青ネギはかけ放題です

iPhoneアプリを作ってみた。-逆ポーランド記法電卓編-

概要

wikipedia:逆ポーランド記法
練習として逆ポーランド記法を計算してくれる電卓を作った。

  • オペランド演算子は全てスペース区切りで入力しないとダメ
  • Clearボタンなどはなし。BackSpaceで計算結果消してください
  • 小数点は自動でfloorされる素敵仕様

とまあ、使い勝手は悪いが一応完成できてよかった。

スクリーンキャプチャ

見事にハマる

難しかったところは特になかったが、何度かハマった。

まだ作り始めたばかりなのにSIGABRT受け取って焦った。

xibファイル編集してアウトレットとかアクションをちょこちょこ作って接続して。。
「とりあえず走らせてみよう」

エラー
原因は、作ったアウトレットをxibファイルのオブジェクトと接続した後に、「やっぱこれ要らないや」ってどちらも削除した際に、InterfaceBuilderから接続を削除していなかったため。
結果、存在しないアウトレットとオブジェクトが接続されている状態になったため、起動時にクラッシュしたものと思われる。あ、ビルドは通るのね。
こういうことがあるたびに「それくらいwarning出してよorz」って思ってしまうんだが、きっと僕が不注意すぎるんですね。

オブジェクト作ってなかった

NSMutableArrayを宣言だけしてメモリ確保忘れてた。忘れててもaddObjectできるのかよ。それくらいwarning(ry

整数かどうかの確認ってどうやるんだ?

ドキュメントで正規表現調べてがんばろうと思ったけど、ググったらコードあったから参考にしました
Re: NSString が整数値かどうか調べる関数 - terazzoの日記
ここらへん。

感想

逆ポーランド記法ってのは多分スタックポインタの操作を練習するのに最適だから定番練習プログラムになってるんだと思うが、NSMutableArrayが賢すぎて結局スタックポインタ使いませんでしたね。
なんの練習だかよくわからなくなっちゃったけど、Xcodeでの開発の練習にはなっているので問題なしとしましょう。

ソース

スタッククラスの部分のソース。

// StackController.h

#import <Foundation/Foundation.h>

@interface StackController : NSObject
{
    int                 _stackCount;
    NSMutableArray*     _stack;
}

@property (readonly) int stackCount;

- (void)push:(int)value;
- (int)pop;

@end

// StackController.m

#import "StackController.h"

@implementation StackController

@synthesize stackCount = _stackCount;

#pragma mark - Initialize

- (id)init
{
    if ( self = [super init] ) {
        _stack = [NSMutableArray array]; //111116
    }
    return self;
}

- (void)dealloc
{
    [_stack release], _stack = nil;
}

#pragma mark - Accessor

- (int)stackCount
{
    return [_stack count];
}

#pragma mark - Method

- (void)push:(int)value
{
    [_stack addObject:[NSNumber numberWithInt:value]];
}

- (int)pop
{
    int lastValue = [[_stack lastObject] intValue];
    [_stack removeLastObject];
    return lastValue;
}

@end