リブートキャンプ by Swift 目次

 

 前回までの話を読んで、Mac持ってる人の中には、そろそろ俺もiPhoneアプリのプログラム読めんじゃね?と思って、「iPhoneアプリ開発、号外 ラノベっぽくない」のビデオで作り方紹介したiPhoneアプリ制作プロジェクトの中身を見た人もいるんじゃないすかね?

 

 ↓これね

 

 

 プロジェクトのアイコンをダブルクリックして表示されるウィンドウは、ワークスペースウィンドウって呼ばれます。

 こいつは、アプリを作るために必要なファイルや設定群を管理するためのもので、左側のナビゲーションエリアに、アプリ作成時に使うプログラムの書かれたファイル(以後Swiftソースファイルって呼ぶ)や画像ファイル等の一覧が表示されるようになってます。

 

 

 このうち、ファイル名の末尾のドットで区切られた部分(拡張子というのだよ)が.swiftってなってるのが、Swiftソースファイルです。

 

 

 でもって、そのSwiftソースファイルの項目をクリックすると、右側のエディットエリアにプログラムが表示されるわけで、こいつを書き直したり、新規にSwiftソースファイルを追加したりしてアプリを自分独自のものに変更するわけなんですが…

 試しにAppDelegate.swiftを選ぶと、ぱっと見、関数しかないじゃんてことになるんですよ。


 これじゃ、プログラム、どこから始まるかわからねーよと。

 しかもメモ書きばっかじゃんというね。

 なぜなのか?

 

 その理由は、iPhoneアプリがオブジェクト指向で作られることにあります。

 

オブジェクト指向ってなんだ?

 という問いかけに対する答えがこれ。

 

ラノベ本の原型から抜粋(168ページ〜部分に相当)


「宝探しからちょっと脱線しますが、例えば、ロールプレイングゲームをプログラムすることを考えてみてください」

 今度は、安堂が黒板に説明を書き始めた。

「登場人物には、村人や勇者、剣士、魔術師、それぞれにいろいろな役割があります。オブジェクト指向プログラミングでは、こういった役割ごとに、新しい型を定義するんです」

 

 

「ほら、数値の変数にDouble型とInt型があったでしょう。あの型のことです」

 黒板の次は、新しいPlaygroundを作成してSwiftのプログラムとして書き込んでいく。

「こうやってclassキーワードを使って書くと、Murabito型とかYusya型、Mahotsukai型っていう、オブジェクト用の新しい型が定義できるんです」

 

 

「あと、こういったオブジェクト用の型はクラスって呼びます。『新しい型としてMurabitoクラスを定義した』って感じですね」

 

クラス

「で、このクラスを元に作られるのが、オブジェクトってことになります。オブジェクトは、こんな感じで作ります」

let m1 = Murabito()
let m2 = Murabito()
let y = Yusya()
let ma = Mahotsukai()

実例:

http://swift.sandbox.bluemix.net/#/repl/5955b1132a36cb5cf81581a1

 

「関数の呼び出しみたいだね」

「そうですね。オブジェクトを作って戻す関数と考えてもいいのかもしれませんね」

「じゃ、作ったオブジェクトをm1やm2っていう定数に、設定してるってことか」

「そうです。この場合、Murabito(村人)クラスのオブジェクトを2つと、Yusya(勇者)クラス、Mahotsukai(魔法使い)クラスのオブジェクトをそれぞれ1つ、作ったことになります」

「プログラミングの定数や変数ってのは数値だけじゃないってことか。かなり抽象的なんだな」

「はい。文字列なんかも指定できますよ」

文字列変数・定数

 多くのプログラム言語は、数値に限定されず、色々なものが、定数・変数として扱えるようになっている。Swiftでは文字列の両端を ” (ダブルクォーテーション)で囲むことで、文字列定数・変数の値を意味することになる。また + による文字列の連結も可能だ。

 

 

 

実例:

http://swift.sandbox.bluemix.net/#/repl/5955b16b2a36cb5cf81581a2

 

「で、こうやって作成されるオブジェクトには、プロパティとメソッドと呼ばれる、オブジェクトを特徴づけるための仕組みがありまして…」

プロパティとメソッド

「例えば魔法使いクラスのオブジェクトの特徴として、その魔法使いが使える魔法の種類名を、プロパティとして用意するなら、こう書きます」

class Mahotsukai {		
	var maho = “回復系”	←プロパティ
}

「プロパティは変数ってこと?」

 左京が安堂に尋ねる。

「ええ、実質、変数なんですが、こんな風にクラス定義内で用意すると、この変数は、作成されるオブジェクトごとに別々に用意されることになるんです。このことから、ただの変数と区別してプロパティと呼びます」

let ma = Mahotsukai()		← maはmahoを持つ
let ma2 = Mahotsukai()		← ma2もmahoを持つ
ma2.maho = “爆裂系”		← ma2側だけmahoを変更

「こんな感じで、プロパティを設定する時や参照する時は、対象となるオブジェクトを指定する必要があるんですよ」

 

 

実例:

http://swift.sandbox.bluemix.net/#/repl/5955b21e2a36cb5cf81581a3

 

 Playgroundの出力を見ると、後から作ったma2側のmahoだけ“爆裂系”に変わっていることがわかる。

「ああ、確かに、こうやってオブジェクトごとに変数を持てると便利だね。いかにも、その個体ごとの属性って感じがするよ」

「はい。プロパティはクラスごとに固有のものなので、mahoプロパティは魔法使いクラスのオブジェクトしか持ってないことになりますから、その点でも、いかにも属性ですね」

y.maho = “爆裂系” ← 勇者オブジェクトはmahoを持たないので設定できない

「勇者クラスなんかには、クリアしたクエストの数をプロパティとして持たせてもいいですね。


 

 てことで、今見ているAppDelegate.swiftの内容はクラスの定義ってわけです。

 その中に関数定義がある。

 これが何を意味するかというと

 

 

ラノベ本の原型から抜粋(177ページ〜部分に相当)


それはそれとして、もう1つのメソッドってのは、オブジェクトが持つ機能を定義できるんです。例えば『勇者には村人と喋る機能を持たせる』ならこうです」

「勇者には村人と喋るメソッド、村人には勇者からの問いに答えるメソッドをそれぞれ用意しました」

 

 

「今度は関数そっくりだね」

「そうです。書き方は関数と同じで、クラス定義内で用意するとメソッドと呼ぶことになります」

 村人側のanswerメソッド定義、勇者側のaskメソッド定義をそれぞれ指差しながら安堂が説明する。

「呼び出し方も関数と同じなんですが、プロパティと同じで、どのオブジェクトにするのかを指定する必要があります」

 

 

「それと、関数みたいに呼び出しとは言わずに、オブジェクトにメッセージを送ると言います」

 

「メソッドもプロパティと同じく、クラスごとに固有のものなので、勇者にanswerメッセージを送ったりもできません。そんなメソッド持ってませんから」

y.answer()    ←勇者にanswerメッセージは送れない

「性質自体も関数と違うところがあって、まず、メソッド内でプロパティを使う場合、自分自身のプロパティを使うことになるってのが1つ」

 そう言いながら安堂が、魔法使いのクラス定義にもanswerメソッドを書き加えていく。

 

 

 最後に、各魔法使いオブジェクトにanswer()メッセージを送ると、出力画面には、それぞれの使える魔法名が表示された。

 

 

 実例:

http://swift.sandbox.bluemix.net/#/repl/5955b35d2a36cb5cf81581a4

 

「ちゃんと自分に設定されたmahoの値を表示するんだね」

 

「はい、それと、もう1つ。最も重要なのが…」


 

 

ということで、以下次回!

 

 

AD