アプリなどを開発するブログ

React Native / Swift / Ruby on Railsなどの学習メモ。


焼きそばパンと後輩で学ぶObjective-C入門① 関数について

関数とは

「私がこう言ったら、まずこれをやって、次にこれをやって、最後にこれをやってね」

というプログラムに対する命令のまとまりのことです。

これを使うことでプログラミングはグッと楽に、楽しくなります。

なぜ関数が必要なの?

f:id:device_me:20090114073352j:plain

プログラムはある意味「要領の悪い後輩」みたいなものです。

あなたが「焼きそばパン買ってきて!」
と言っても、
「兄さん、焼きそばパン...?って何ですの?
カウ...?って初めて聞きましたわ...
俺、もうわかんないっす....
あー俺、やっぱダメ人間ですわ...
頭パンクしてしまいましたわ...」

と言ってエラーを吐いてシステムは終了してしまいます。

なので、事前に以下のことを後輩に教えておく必要があります。

俺が「焼きそばパン買ってきて」って言ったら、
1. 売店に行く
2. 「焼きそばパン」と書かれたパンを探す
3-A. もし焼きそばパンがあれば、売店のおばちゃんに渡す
3-B. もし焼きそばパンがなければ、カレーパンを売店のおばちゃんに渡す
4. お金を払う
5. 俺の所にパンを持ってくる
ってやってね。

こうやって前もって後輩に教えておくことを、
関数(メソッド) を宣言すると言います。

こうして宣言しておくと、いつでもどこでも、あなたは後輩に
「焼きそばパン買ってきて」の一言だけで、1~5の手順を毎回説明することなく、
パンを手に入れる事ができます。

ただ、この後輩は要領は悪いですが処理速度は異様に早く、
一度教えておくと0.0001秒とかで焼きそばパンを買って来てくれる、
すごい奴です。

この素晴らしい後輩をいかに使いこなすか、
と考えるとプログラミングへの苦手意識が少し軽減されるかもしれません。

Objective-Cのコードを少しでも見たことのある方のために、
「パン買ってこい」メソッドをObjective-C風に書くとこんな感じになります。

※注 こちらのコードはあくまでイメージです。実際にはこんなコードは存在しません。

// 焼きそばパン買ってこいメソッドの宣言
-(NSBread *) goToBuyYakisobaBread {
    // selfは「お前」自身。すなわち後輩のことです。

    // 1.  売店に行く  
    [self goShop];

    // 2. 売店のパンを見渡し、「焼きそばパン」と書かれたパンを探す  
    (NSBread *) bread = [self getBreadWithTitle:@"焼きそばパン"];

    // 3-A.  もし焼きそばパンがあれば
    if(bread) {
        // 売店のおばちゃんに渡す  
        [self passToShopGirl];
    } else {
        // 3-B.  もし焼きそばパンがなければ、カレーパンを売店のおばちゃんに渡す          
        bread = [self getBreadWithTitle:@"カレーパン"];
        [self passToShopGirl];
    }
    
    // 4. お金を払う  
    [self payMoney:100];

    // 5. 俺の所にパンを持ってくる  
    return bread;
}

これで、どこからでも「焼きそばパン買ってこい」を使って
焼きそばパンを手に入れることができます。

例えばviewDidLoadから

// お前さ〜、画面の読込が終わったら
-(void) viewDidLoad {
    // すぐパン買って来い!
    NSBread *bread = [self goToBuyYakisobaBread];
}

例えばボタンが押されたら

// お前さ〜、このボタンが押されたら
- (IBAction)btnPushed:(id)sender
    // すぐパン買って来い!
    NSBread *bread = [self goToBuyYakisobaBread];
}

メソッドの返り値について

宣言したメソッドを見てみましょう。

-(NSBread *) goToBuyYakisobaBread 

この、

-(NSBread *) 

ってなんでしょうか?
これは、返り値 と言って、この関数を呼んだ時に、
何が返ってくるべきかを宣言するものです。

例えば、後輩に「焼きそばパン買って来い」
と言ったのに、おまんじゅうを持って帰ってきたら、
あなたは後輩に殴りかかると思います。

が、「カレーパンでもいいよ」とも言ってあるので、
あらかじめ「焼きそばパン買って来い」と言ったときは、
ちゃんと「パン」を持って帰ってこいよ。まんじゅうはダメだぞ、
と宣言しておきます。

Objective-Cのコードを読んだことがある人は、

-(void) methodName {

}

みたいに、返り値の部分に「void」というのが入ってることを見たことがあると思います。
voidというのは「何も返さなくていいよ」という意味です。

「パン買って来い」の場合はパンを返してもらわないと困りますが、
例えば「校庭10周走ってこい」の場合は、別に何を返してもらう必要もありません。
なので、返り値にはvoidを宣言します。

-(void) runAroundSchoolYard {
    // 後輩は校庭に行って10周走る
    [self goToSchoolYard];
    [self runAroundWithTimes:10];
}

引数について

後輩に校庭を走らせるにあたり、毎回10周走らせていては、さすがに後輩がかわいそうです。
何周走るかを便利に指定できるようにしましょう。
この時に役に立つのが引数です。

-(void) runAroundSchoolYard:(int) times {
    // 後輩は校庭に行って指定された回数走る
    [self goToSchoolYard];
    [self runAroundWithTimes:times];
}

ここでtimesを指定しているように、

-(返り値) メソッド名:(引数の型) 引数

という風に指定すると、変動する値を渡せます。
例えば、

// お前さ〜、画面読込終わったら
-(void)viewDidLoad {
    // 校庭5周走ってこい!
    [self runAroundSchoolYard:5];
}
// お前さ〜、このボタンが押されたら
- (IBAction)btnPushed:(id)sender
    // 校庭20周走ってこい!
    [self runAroundSchoolYard:20];
}

と、周数だけ変えて色んな所から呼ぶことができます。

いかがだったでしょうか?
少しドSな先輩になってしまいますが、信頼のおけるかわいい後輩だと思うと、
呪文のようなコードも何だか愛せてきませんか?

絶対に先輩の言うことに逆らわず、めちゃ早い、という本当に優秀な後輩なので、
かわいがってあげましょう。

次回は後輩と後輩のおかんで学ぶObjective-C入門② 変数について をお送りします。