たのCoco (6) Part 3 Lesson 10

Let's Rock!な発表が間近ってことで少しわくわくしつつ
今日も変わらず「たのCoco」通し読みの続きです.

今回のLesson 10はようやく主役のObjective-Cの解説に入るので,
キーワードをメモしながらのエントリを書いていこうと思います.

蛇足(誤植発見)

P.152 L6 (誤) MyObjCtest.m (正)ObjCTest.m
# 同ページのソースコード名も同様

基本

Objective-Cで作成するクラスは,クラス宣言とクラス実装に分かれている.

クラス宣言
  • インターフェースを用意するファイル (hoge.h)
    • .hの拡張子は「ヘッダ」と理解する!
  • フレームワーククラスの読み込みは #import
  • 自前のクラスを読み込むときは#import "hoge.h"
  • クラス宣言は@interface ~ @endに書く!
  • インスタンス変数の宣言はブレイズの中に書く.
  • メソッドの宣言は-(返り値型)メソッド名;
  • 引数付きメソッドは-(返り値型)メソッド名:(引数型)引数名;
  • メソッドの引数が増えたら... 半角スペース+ラベル名をつける
  1. クラスメソッドの宣言は+(int)hoge;

クラス宣言まとめ

// Cocoaクラスを読み込む
#import <hoge/hoge.h>
// 自前クラス読み込み
#import "hogehoge.h"
// NSObjectはCocoaのルートクラス.(cf. javaではObject)
@interface MyObj: NSObject
{
  // インスタンス変数
  int x;
  int y;
}
// メソッド宣言
-(int)hoge;
// メソッド宣言(引数あり)
-(void)huga:(int)piyo;
// メソッド宣言(複数の引数)
-(void)huga:(int)piyo fuga:(int)puyo;
// クラスメソッド(staticメソッド)
+(int)huga;
@end

ブレイズの外にメソッドがあるのが奇妙な感じ.
ラベル名ってのもまた奇妙.

どうやらラベルありメソッドってのは

  void hugaFuga(int piyo);

とか

 def huga_fuga(piyo, poyo)
   ...
 end

ってことらしい.
なんで1つ目の引数にはラベルがつかないんだろ?読み方が不明.
きっとラベル無しも良いに違いない.
型によるタイプヒンティングだけではなく,
ラベルで引数の用途を伝えているのかなぁ?なんて予想.
# へんに「予習」しないでおくw


まだこの時点ではコードを書けてないっ><

クラス実装
  • 実装をするファイル(hoge.m)
    • .m拡張子は「メソッド」と理解するべし!
  • 同名のクラス宣言ファイルはimportする
  • 「実装」クラスなので@implementation ~ @endの間に実装する
  • 他のクラスから呼び出さないときはクラス宣言無しに実装だけ書けば良い
#import "hoge.h"

@implementation

// メソッドの実装
-(int)hoge
{
  return x;
}
// メソッドの実装(引数あり)
-(int)hoge:(int)a fuga:(int)b
{
  return a+b;
}
@end

オブジェクトのための変数型

生成したインスタンスを補完するための変数には型が必要だよねって話.

オブジェクト型

MyObjectを格納する変数は

MyObject* object;

という感じにポインタで表現すれば良いらしい.
ルートクラスのNSObject*1だけは特別で,id型を使う.

Object hoge;

ってのと同じかな.

nil値

オブジェクトが何も指し示さないことを表すにはnilを使う(代入する).

メソッド呼び出し

MyObject* objectにMyObjectクラスのインスタンスが格納されていて,

-(int)count;
-(void)setCount:(int)cnt;
-(void)setCount:(int)cont andIndex:(int)index;
+(int)getCount;

というメソッドを持っていた場合,

int count = [object count];
[object setCount:12];
[object setCount:5 andIndex:6];
[MyObject getoCount];

と,
変数= [インスタンス メソッド名]で返り値を変数に格納できる.
また,[インスタンス メソッド名:引数]でインスタンスメソッドを呼び出せる.
クラスメソッドは[クラス名 メソッド名].

# 配列ぽいけどカンマ区切りじゃないだけ!?
# c++phpなんかだとアロー演算子を使うところ.

nilオブジェクトの扱い

nilオブジェクトでメソッドを呼び出そうとすると...
0が返ってくる!
面白いけどバグチェックでハマりそうw

長くなったなぁ...
Lesson 10の残りはHello Worldのコードを読み直して解説する内容でした.
結局コードは書かないLessonでしたとさ.

*1: NSはNextStepの意味なんだって!