継承のお話(2) | 初心者がiPhoneアプリを作るブログ

初心者がiPhoneアプリを作るブログ

初心者がiPhoneアプリを作るブログです.
入門レベルですので開発初心者にも,できるだけ分かるように丁寧に説明していきます(多分).

それでは,MySecondClass.mのコードをのせますねー.
#import "MySecondClass.h"

@implementation MySecondClass
@synthesize myFloat;

- (id)initWithFloat:(float)f String:(NSString *)str{
    // 継承元の関数を呼ぶ時は[super *]を使う
    self = [super init];
    if(self){
        // プロパティの初期化をする
        self.myFloat = f;
        // MyFirstClassを継承しているので,myStringプロパティが使える
        self.myString = str;
    }
    return self;
}

@end

プロパティを使う準備のための「@synthesize」をします.
その下に関数が書かれています.
- (id)initWithFloat:(float)f String:(NSString *)str{
ここでObjective-Cの関数の定義の仕方について説明します.

まずはじめの「-」はインスタンスメソッドを表します.
前回までのエントリで
「["インスタンス" ~]」
「["クラス" ~]」
の2種類の呼び出し方があったのを覚えていますか??

例えば,
[myClass  setInt:3];
[UIColor  redColor];
等が挙げられます.

このうち,「-」で始まる関数は「インスタンスメソッド」と呼び,
インスタンスが呼び出すメソッド(関数)になります.
上記の例だと,上のほうです.

次に,「(id)」は返り値を表します.何も返さない場合は
「(void)」
と書きます.

更に,「initWithFloat」は関数の名前を表します.

最後に,「:(float)f String:(NSString *)str」は引数になります.
関数の名前の後に「:」をつけて,「(型名)」「関数の中で使う変数名」と続きます.

第二引数からは「String」これは関数を実際に用いた時に,
何を引数として与えればよいか分かりやすくするためのものです.
つまり何でもいいです(あまり変なのはオススメしませんが).

その後は第一引数と同じです.

これで関数の定義ができます.

少し長くなりましたが,まだまだいきます!!
- (id)initWithFloat:(float)f String:(NSString *)str{
    // 継承元の関数を呼ぶ時は[super *]を使う
    self = [super init];
    if(self){
        // プロパティの初期化をする
        self.myFloat = f;
        // MyFirstClassを継承しているので,myStringプロパティが使える
        self.myString = str;
    }
    return self;
}

それでは,中身の説明です.
self = [super init];
ここでは,継承元のクラスメソッドを呼び出しています.
「self」とは,自分自身(インスタンス)のことです.
「[super  init]」で継承元のインスタンスメソッドである「init」を呼び出しています.

その後,「init」が成功して,「self」に初期化されたインスタンスが格納されれば,
更に初期化を進めます.
if(self){
    // プロパティの初期化をする
    self.myFloat = f;
    // MyFirstClassを継承しているので,myStringプロパティが使える
    self.myString = str;
}
ちなみに,私が今まで組んできたプログラムで,「init」が失敗したことはありませんが,
丁寧にエラー処理をすることは大切なので,みなさんも心がけていきましょう.
私にはできません笑
return self;
最後に自分自身を返り値としてreturnして終わりです.

あれ??このメソッドの返り値は「id」型でしたよね??
ということは,MySecondClass型じゃないの??

と思われる方がいるかもしれません.
私もそう思いますが,初期化の際はid型を用いることになっているようです.

理由は各自調べてみて下さい笑

id型とはオブジェクトを表すもので,オブジェクトであれば,
全てid型で表すことができます.

といってもよくわからないと思いますので,
initメソッドの返り値はid型なんだ,くらいに思っておいてください.

長くなったので,続きは次の記事で.

次の記事へ

HOMEに戻る