現在のTinyViewでは、表示している画像からJPEGやPICTに変換する処理は、ファイルに保存する時の処理に組み込まれてしまっています。この様な構造を取ってしまいますと、せっかく作った変換処理が、TinyViewの保存にしか使えません。本来、この様な画像に依存する処理は、画像の方に組み込まれるべきです。そうすれば、保存以外の用途にも使えますし、他のプログラムにもそのまま持って行くことができます。
NSImageクラスには、TIFFRepresentationという、TIFFフォーマットのデータを返すメソッドがあります。これに倣って、PICTRepresentationという、PICTフォーマットのデータを返すメソッドを追加実装してみましょう。
NSImageの様にソースが公開されていないクラスにメソッドを追加する場合、大抵の言語では継承という方法しかありません。ですが、Objective-Cではもっとお手軽な方法を取ることができます。それは、カテゴリという方法です。これを使いますと、既に存在するクラスにメソッドを追加することができます。
では、さっそく始めましょう。まずはファイルを追加します。TinyViewのプロジェクトを開いて、ファイルの一覧の中からClassesというグループを選んで下さい(fig.01)。
[fig.01] ファイルの一覧からClassesを選ぶ。 |
選んだら、ファイルメニューから「新規ファイル...」を選んで下さい(コンテキストメニューから選んでもかまいません)。パネルが開いてどの様なファイルを作るのか聞いてきます。残念ながら、この中には「Objective-C category」という種類は無いので、代わりに「Objective-C class」を選んで下さい(fig.02)。
[fig.02] ファイルメニューから「新規ファイル...」を選ぶ |
選んだら「次へ」ボタンを押して下さい。パネルの中身が切り替わって、ファイル名等を入れる画面になります。ファイル名が「untitled.m」になっていると思いますので、これを「ImageProducingData.m」という名前に変えて下さい(fig.03)。
[fig.03] ファイル名を「ImageProducingData.m」に変える |
変えたら完了ボタンを押して下さい。ImageProducingData.hとImageProducingData.mという二つのファイルがClassesというグループの中に出来たはずです(fig.04)。もし、違う場所に出来てしまった場合は、ドラッグしてClassesの中に移動させて下さい。
[fig.04] 二つのファイルが生成される |
この様にしてファイルを追加した時、私は最初に次のことを行っています。追加されたファイルの先頭のコメントに、Created by ○○○○と書いてある部分があるのですが、この○○○○の部分は、おそらく日本語になっています。そこで、これを英字に書き換えています。何でこんなことをするのかと言うと、Project Builderはプログラムの中に日本語が書いてあると、おかしな挙動をすることがあるからです。従いまして、Objective-Cはコメントの中だけでしたら、本来ならASCIIコード以外も使えるはずなのですが、私は一切日本語を書かないようにしています。ただし、これは仕様上は許されているはずですので、将来的に改善するかもしれませんし、どうするのかは、各自の判断にお任せします。
話がそれました。それではImageProducingData.hの中を見て下さい。ファイルを作る時に「Objective-C class」を選択しましたので、この雛形では、ImageProducingDataクラスが宣言されています。これをNSImageクラスのImageProducingDataカテゴリの宣言になるように修正します。第8回で説明しましたが、クラスの宣言を行う場合、インターフェース部は次の様に書いていました。
@interface クラスの名前:スーパークラスの名前 { インスタンス変数の宣言 } メソッドの宣言 @end
カテゴリの場合は次の様に書きます。
@interface クラスの名前 (カテゴリの名前) メソッドの宣言 @end
つまり、どのクラスにどんなメソッドを追加するのかを宣言しているわけです。これを見て気付かれたと思いますが、インスタンス変数は追加できません。では、PICTRepresentationの宣言を行うべく、次の様に書き直して下さい。
@interface NSImage (ImageProducingData) - (NSData *)PICTRepresentation; @end
カテゴリを宣言する時には、もう一つやらなければならないことがあります。それは、メインのインタフェース部を参照することです。今回はNSImageクラスにメソッドを追加していますので、NSImage.hをImportすればそれで良いのですが、私はこういう時は面倒なので、Cocoa.hをImportすることにしています(Cocoa.hをImportすれば、Application KitとFoundationの両方の全てのヘッダがimportされます。)。そこで、次の様に、Foundation.hをimportしている所をCocoa.hをimportするように書き換えて下さい。
#import <Foundation/Foundation.h> ↓ #import <Cocoa/Cocoa.h>
以上でインターフェース部の実装は終わりです。次にインプリメント部の実装ですが、この続きは次回とさせていただきます。