iOSプログラミング講座第9回「デリゲート」 (90)

こんばんは
今日もiOSプログラミング講座やっていきます
今日のテーマは「デリゲート」です

delegateとは「委任する」という意味です
プログラミングの世界ではあるクラスの処理を別のクラスに任せるといった感じです

例えば僕たち「国民」クラスは「政治家」クラスに「政治」の処理を委任していますよね

いきなり難易度高すぎワロタ

では、なぜプログラミングの世界でデリゲートが必要なのか?

自分でやればいいじゃん

と思うかもしれません。

少しずつ紐解いていきましょう。
私たちが行っていくデリゲートのプログラミングでは私たちは「委任される側」です。
つまり先の例で行けば私たちが「政治家」です。

どのような処理が私たちに任されるのか

ここで登場する概念が「イベント」です
ただしここでの「イベント」はお祭り的な意味合いではなく、「出来事」という意味合いのイベントです。

アプリ開発ではイベントが起きた時、どのような処理をするのか、それを私たちが「任されます」

【ゆっくりしていってね!!】
       ∧,,∧  ∧,,∧     ∧,,∧
   ∧,,∧(´・ω・`)(´・ω・`)∧,,_∧・ω・` )
  ( ´・ω・`)(つ⌒と つ⌒と)´・ω・`)  ∧,,∧
  (つ∧( ´・ω・`)(´・ω・`)(´・ω・` ∧,,∧・ω・` )
∧,,( ´・ω(_.__つと_(_.__つと_)  ∧,,∧ ∧,,∧
(´・( つ ∧,,∧     __ _(´・ω・` )・ω・` )
 ( ∧,,∧・ω・`)_____|i\__\ と )∧,,∧と)

  ( ´・ω・`)と_※ ※ |i i|.====B|ヽノ(・ω・` )
  (つとノ`--∧,,∧|\\|_____◎_|_i∧,,∧  ∧,,∧
       ̄( ´・ω・| | ̄ ̄ ̄ ̄ |(・ω・` )(・ω・` )

        (つとノ.\|_____|(つとノ (つとノ

イベントはことあるごとに発生します。
テキストフィールドで例えます。
テキストフィールドでは

・テキストの編集が始まった時
・テキストの編集が終わった時
・テキストが編集されてる時
・テキストが全消去ボタンで消される時
・テキスト編集中に改行キーが押された時

などたくさんのイベントが用意されています。
ここで注目して欲しいのが全てのイベントは「~時」に起こっているということです。

何かが起きた時にイベントが起きます。

・あなたが起きた時
・あなたが寝る時
・あなたがトイレに行った時

このような時にイベントが発生します。
イベントが発生した時何をするかを「私たちが任され、それを実装していく」のです。

いつになったらパンを銜えた美少女とぶつかるイベントが発生して
ぼくに事後処理がデリゲートされるんでしょうか

では具体的にどのように実装するのか?

まず、どのクラスが任されるのかを決めなくてはいけません。
IBでの操作は省きますが、まず、任されたことを示す「名札」を掲げなければいけません。
「委任者」の資格を手に入れるのです。

これをプロトコルを実装するという手段で獲得します。

アプリ「テキストが編集されたぞ!」

アプリ「おい、この時の委任者誰だ!」

お前「わたしです」

こんな感じです。

委任者には「とりあえずこの処理は絶対してくれ」という義務的な処理と「まあしたいならしてもいいっすよ」という権利的な処理があります。

例えばテキストが編集された時に起こるイベントは特になんの処理もしなくてもそのまま編集されるだけですので問題はありません。

例えば「死」と入力されたら「●」へ伏字変換したい場合などはこの処理を委任してもらうのもいいでしょう。

以上で第9回を終わります。

では5分間の休憩を挟みます。
次の講義は「オブジェクト指向入門」です。

では始めます。

第1回オブジェクト指向入門「クラス」

みなさん、こんばんは。
今からオブジェクト指向入門講座を始めます。

オブジェクト指向ってなんでしょう?
オブジェクトってなんでしょう?
objectで辞書を引いてみます

object
1. 物体 個体

そうです。オブジェクトとは物です。
指向ってなんでしょう。
辞書を引いてみます

指向
[名](スル)ある方向・目的に向かうこと。

つまりオブジェクトを中心にしたプログラムへ向かうような技法のことです。

オブジェクト指向プログラミング。
Object Oriented Programming

頭文字を取ってOOPとも呼ばれます。

オブジェクトを中心にしたプログラミングというのはどういうことなのか?

これはおいおい答えるとしてまずはオブジェクトの本質に迫ります。

OOPにおいてオブジェクトには仕様書があります。
どのような構造をしたオブジェクトなのか。
どんなことをするのか。
OOPではこの仕様書をまず書いてやります。
そして「仕様書に沿ったオブジェクトを作れ」と指示します。
仕様書を工場に持って行くようなものですね。

人間もどきの仕様書
情報
・名前
・年齢
・満腹度

行動
・名前を名乗る
・年齢を言う
・食べる
・うんこをする


仕様書を作りました。
この仕様書に基づいてオブジェクトを作れ!と指示するとこの仕様書の通りのオブジェクトが出来上がります。

ただし、この人間もどきはあいさつはできません。
なぜなら「あいさつする」という行動は仕様書にないからです。
歩くこともできません。
「歩く」という行動が仕様書にないからです。

なんでこんな過疎ってんの?

プログラミングの世界では設計図を「クラス」といいます。
クラスから作られたオブジェクトをインスタンスといいます。

プロトタイプベースの言語のことも時々でいいから思い出してあげてください

「オブジェクト指向はわかったけどなんでそれやらないといけないわけ?」

実際のコードを見てみましょう。

まず人間もどきクラスを作ります。

人間もどきクラス
{
int 名前;
int 年齢;
int 満腹度;

名前を言う関数 {
print 名前;
}
年齢を言う関数 {
print 年齢;
}
食べる関数 {
満腹度 にプラス3;
}
うんこをする関数 {
もし満腹度が100以上ならうんこする
}
}

クラスができたので処理をしていきます。

人間もどき pseudohuman1;
人間もどき pseudohuman2;

pseudohuman1の名前 = けんすけ;
pseudohuman2の名前 = まちこ;

pseudohuman1の年齢 = 38;
pseudohuman2の年齢 = 26;

pseudohuman1の名前を言う関数;
pseudohuman2の年齢を言う関数;

for(40回繰り返す) {
pseudohuman1の食べる関数;
}

pseudohuman1のうんこをする関数;

>>55
何でiOSプログラミングなのにC++とかJava風のクラス作ってんだよ

JC++ってJKになんの?

>>59
実装部と定義部か分かれてる奴はわかりにくいからまずは設計図を意識した

では次に非オブジェクト指向的にプログラミングしてみます

けんすけの名前 = けんすけ;
まちこの名前 = まちこ;

けんすけの年齢 = 36;
まちこの年齢 = 25;
けんすけの満腹度 = 0;
まちこの満腹度 = 0;

print けんすけの名前;
print まちこの年齢;

for(40回) {
けんすけの満腹度プラス3;
}

if(けんすけの満腹度 > 100) {
けんすけがうんこをする;
}

if(today == XMAS) {
  while(Kensuke.chinko.status == BINBIN) {
    Kensuke.chinko.insert(Machiko.manko, WITH_GOM);
  }
}

@interface Pseudohuman : NSObject
{
NSString *name;
int age;
int hunger;
}

- (id)initWithName:(NSString *)n Age:(int)age;
- (void)sayName;
- (void)sayAge;
- (void)evacuate;
@end

@implementation Pseudohuman
- (id)initWithName:(NSString *)n Age:(int)a {
name = n;
age = a;
hunger = 0;
}
- (void)sayName {
NSLog(@"わたしの名前は%@です", name);
}
- (void)sayAge {
NSLog(@"私は%d歳です", age);
}
- (void)evacuate {
if (hunger > 100) NSLog(@"うんこしました");
}
@end

間違えました

- (id)initWithName:(NSString *)n Age:(int)a {
self = [super init];
if (self != nil) {
name = n;
age = a;
hunger = 0;
}
return self;
}

int main(void) {
Pseudohuman kensuke = [[Pseudohuman alloc] initWithName:@"けんすけ" Age:36];
Pseudohuman machiko = [[Pseudohuman alloc] initWithName:@"まちこ" Age:25];

[kensuke sayName];
[machiko sayAge];

for (int i = 0; i<40; i++) {
[kensuke eat];
}

[kensuke evacuate];

return 0;
}


Objective-Cでの実装例てす。
eatメソッドは書く忘れました。

オブジェクト指向って簡単でしょ?

3分間の休憩を挟みます

次の講義は「質疑応答」です

Objective-Cの記法気持ち悪いです先生

>>81
やってるうちに癖になってObjC大好きになります

では講義を始めます

質問のある方はどうぞ

ないようなので本日の講義を終わります

[lesson finish];

このSSまとめへのコメント

このSSまとめにはまだコメントがありません

名前:
コメント:


未完結のSSにコメントをする時は、まだSSの更新がある可能性を考慮してコメントしてください

ScrollBottom