ストップウォッチを作ろう - Cocoaプログラミング

ストップウォッチクラスを設計しましょう。う〜んモノづくりの楽しみ〜

てくっち

今日はストップウォッチを設計してみます!

てくっち

手元にストップウォッチがある人は、手に取ってみて。

和田

わーい

てくっち

ストップウォッチの機能は、時間を計測することですねー。

和田

ふむふむ

てくっち

操作方法は、start/stopボタンと、resetボタンが基本かしらね。

和田

なるほど…

てくっち

そこでストップウォッチクラスにはどんなメソッドがいるのか、考えてみましょう。

てくっち

- (void)startStop;
- (void)reset;

てくっち

まず上の2つのボタンを押すという操作に対応するメソッドですねー。

てくっち

それから、時間を読み出すメソッドがいりますね。

てくっち

- (NSTimeInterval)second;

てくっち

NSTimeIntervalの正体は、倍精度実数(double)です。

てくっち

メソッドは、以上の3つでいきましょう。

和田

上のふたつ…

和田

なんか画像あったほうがいいんでないすかね…。

てくっち

うーーん・・

和田

ストップウォッチの画像的な…

和田

あ、ちょっと待ってくださいね。

和田

和田

デカッ

てくっち

これに書き込んだらいいでしょうか・・

和田

のほうがビジュアル化しやすいのでは…

てくっち

てくっち

これでどうかしら…

和田

わかりやすいっ!

てくっち

で、実際の使い方はですね、まず

てくっち

StopWatch *watch = [[StopWatch alloc] init];

てくっち

とインスタンスを作っておいてから、

和田

これは前回やったやつですね先生!

和田

3つの処理が入れ子になっているというアレですね

てくっち

そうでやんす!

てくっち

インスタンスを作るときはこうするという公式だと思っておいてもいいでしょう。

和田

わかりましたっ!

てくっち

[watch startStop];

てくっち

次にこうすると、ストップウォッチがスタート。

和田

watchクラスのstartStopメソッドをキックしてるってことですか?

てくっち

その通りですー

てくっち

NSTimeInterval s = [watch second];

てくっち

次にこれで値を取得。

和田

NSTimeInterval型の変数Sにwatchクラスのsecondメソッドの返り値を入れると?

てくっち

まさにその通りですー

和田

やったー!

てくっち

で、次にこうやってストップウォッチを止める。

てくっち

[watch startStop];

てくっち

で、値をリセット。

てくっち

[watch reset];

てくっち

このストップウォッチが不要になったら、

てくっち

[watch release];

てくっち

で、解放。以上ですねー。

和田

ほほほぅ

てくっち

ということで、ストップウォッチクラスのヘッダファイルは、こんな感じになります

てくっち

#import <Foundation/Foundation.h>

@interface StopWatch : NSObject {
  NSTimeInterval second;
}
@property(readonly, assign) NSTimeInterval second;
- (void)startStop;
- (void)reset;
@end

てくっち

@propertyってまだ説明してませんでしたっけ・・

和田

プロパティ…。

和田

説明されてませんね…。

和田

これは実装の部分ですよね?

てくっち

えっと、.hファイルのほうです

てくっち

前に、インスタンス変数は外部には基本的に秘密だと説明しましたよね。

和田

はい

てくっち

で、利用者に許す部分だけ、特別にアクセサメソッドを書くのでした。

てくっち

でもアクセサメソッドを書くのは退屈なものです。

てくっち

そこで@propertyなんちゃらという宣言で、コードを量を減らせるしくみが提供されたというわけです。

てくっち

と同時に、これまではインスタンス変数のうち、どれが秘密でどれが公開なのか、ぱっと見わからなかったところが

てくっち

@property宣言があると、外部からアクセスできるんだなと明らかなので、わかりやすくなりました。

てくっち

iPhone開発のチュートリアルなどではこの書き方を積極的にすすめているようなので

てくっち

あえて書いてみましたよ。

てくっち

従来の書き方では、

てくっち

@property(readonly, assign) NSTimeInterval second;

てくっち

- (NSTimeInterval)second;

てくっち

この2つが同じ働きです。

てくっち

なんか@propertyのほうが文字が増えとるやないか〜い!

てくっち

readonlyとかassignとか細かいし・・・。

てくっち

ちなみに外部から書き込みも可にする場合は、

てくっち

@property(readwrite, assign) NSTimeInterval second;

てくっち

- (NSTimeInterval)second;
- (void)setSecond:(NSTimeInterval)newValue;

てくっち

に相当します。これだと省力化できてるかな。

和田

ふむふむ

和田

代替されているのですね

てくっち

そうなんです

てくっち

で、こいつらとペアになって、.mファイルのほうでも実装が減らせちゃいますね

てくっち

さて仕様が決まったので、次はいよいよ実装ですが!

てくっち

また次のテーマでやりましょう〜

和田

和田

次はプロジェクトを作るところから全部やるのですか?

てくっち

うーん、プロジェクトは、次の次にしましょうかね・・・

和田

ま、まずは概要からってことですね!

てくっち

次回にストップウォッチクラスの実装(.mファイル)を作って、

てくっち

その次にプロジェクトにいきましょうかね

和田

リョウカイです!

てくっち

ではまた次回に!