修正日: 07/06/20
C言語補習3
構造体
構造体に関してはどこまで説明すれば良いか、そもそも説明する必要があるのか悩むところです。Cocoa環境において構造体というのは、「全然使わない」とも言えるし、「しょっちゅう使う」とも言えるのです。なので、知らなくてもまあ何とかなるけど、知らないと理解できないところも多い、という感じでしょうか。まあ一歩進んでちゃんとしたCocoa本を買うとおそらく構造体にぶつかることになるので、今のうちに学んでおいた方が良いと思います。
で、構造体は一体どんなものか、というとこんなものです。
typedef struct _NSSize {
float width;
float height;
} NSSize;
これは構造体の定義なのですが、作り方は覚えなくていいです。Cocoaで構造体を自分で定義することはまずありません。重要なのは「クラスとどう違うか」この一点だけです。
構造体もクラスと同様に、複数のデータをカプセル化するための仕組みです。上のサンプルはwidthとheightという二つの情報を持つNSSizeという構造体です。ウィンドウのサイズなどを指定するためのものですね。
構造体がクラスとどう違うのかというと、第一に、クラスはメソッドを持っているのに対し、構造体はメソッドは持っていません。つまり構造体は自分では何も出来ない単なるデータの入れ物です。
第二に、これが重要なのですが、オブジェクトと違ってポインタを使わないで扱うことができます。Cocoa環境においては、これがとても重要な違いになります。例えばこんな感じ。
NSSize windowSize = NSMakeSize(10,10);
(ちなみにNSMakeSize()というのはNSSize型の構造体を作るための関数です)NSStringなどのオブジェクトは
NSString *string = @"something";
というように必ずポインタを使う、と学んだと思いますが、NSSizeはオブジェクトではなく構造体なので、*を付けないで直接使うことができます。なので、Cocoa本などを読んでいて「NS何とか」なのにポインタを使わずに扱っているデータは構造体である、と考えてください。
もう一つ、構造体の中のデータにアクセスするときは、.を使います。例えばこんな感じ。
NSSize windowSize = NSMakeSize(10,10);
float windowHeight = windowSize.height; //ウィンドウの高さを取り出す
windowSize.width = 120; //ウィンドウの幅を120にセットする
「構造体の名前.要素の名前」という形でデータを取り出したり、値を代入したりすることができます。ちなみにオブジェクトの場合はこういう風にオブジェクト内の値にアクセスすることが(今のところ)できません。
あと、話がややこしくなってしまいますが、構造体のポインタから内部のデータにアクセスするときは->を使います。
NSSize windowSize = NSMakeSize(10,10);
NSSize *pointer = &windowSize;
float windowHeight = pointer->height; //ウィンドウの高さを取り出す
pointer->width = 120; //ウィンドウの幅を120にセットする
これは以下のように書くのと同じことです。
float windowHeight = *pointer.height; //ウィンドウの高さを取り出す
*pointer.width = 120; //ウィンドウの幅を120にセットする
わかりましたか?わからないですよねー、この程度の説明では。でも大丈夫、現時点ではわからなくても良いです。重要なのは本やサンプルコードを見ていて混乱しないこと。これくらい読んでおけば、NSSizeにはなぜ*がつかないのだろう、.や->ってなんだろう、と皆目見当がつかなくて途方にくれずにすむと思います。勉強を続けていてなんだかよくわからないものに出くわしたら、そういえば構造体とかいうのがあったな、と思い出して調べてください。その程度の理解で今のところは大丈夫です。
ここまで三つC言語の技術を紹介しました。C言語について勉強しようと思えば、学んでいない知識がまだまだあるのですが、Cocoa環境ではあまり使わないものも結構多いので、この辺で終わりにしておきます。「C言語」でググれば、C言語講座がいくらでも出てきますので、これを見て自分で勉強してください。
ただし、Cocoaでの開発をメインで行うつもりであれば、まずはCocoa本を読むことをお勧めします。Cocoa本を一通り読んでみると、Cの技術の中でどのようなものをよく使うのかがわかってくると思います。そこら辺を頭に入れてから改めてCを勉強すれば、より深い理解を得られることでしょう。