作文アプリを作る

配列とファンクション

作文ゲームという遊びを覚えていますか?

いつ、だれが、だれと、どこで、何をした、という文章を何人かでバラバラに考えて繋げる遊びです。

それをアプリで作ってみましょう。

学習内容
・配列
・ファンクションを作る
・文字列を繋げる
・復習と応用問題

1.新しいプロジェクトを作る

いつものようにSingle View Applicationでプロジェクトを作ってください。

名前は『sakubun』としておきましょう。

2.画面デザイン

画面には作文ボタンと、結果を表示するテキストビューを配置してください。

テキストビューはラベルよりも長い文章を表示するのに使う部品です。複数行の文章を自動で見やすく表示してくれます。

ラベルは単語やちょっとした短い文字列を表示するのに使いますが、テキストビューは長い文章を表示するのに使います(今回のはそこまで長くないですが)。

テキストビューには最初、英文の長い文字列が設定されているので、これを削除してください。

幅は画面いっぱいで、Autoresizingも設定してください。左右マージン固定で幅の調整をオンにしてください。

テキストビューのアウトレットと、ボタンのタップアクションを接続してください。

3.プログラム全体はこちら

下が今回書く必要があるプログラムです。

ちょっと量が多いですね…。でも大丈夫です。実はそうでもありません。一つずつ説明します。

4.配列でデータを定義します

最初に、作文ゲームに必要なデータを作ります。

今回は『配列』という箱を使用します。

配列は、複数の変数をひとまとめにしたもので、それぞれに対して『配列の何番目』という形でアクセスできます。

今回作った配列は下記の5つです。全て文字列が入っています。

それぞれの文字列は自分で中身を変えて構いません。自由に入力してください。打ち込むのが面倒な方は下記をコピペしてください。

	let whenArray: [String] = ["遠い遠い昔", "昨日", "1週間前"]
	let whereArray: [String] = ["世界の中心", "月", "大手町"]
	let whoArray: [String] = ["ピコ太郎", "草刈正雄", "トランプ大統領"]
	let whoArray2: [String] = ["オバマ元大統領", "プーチン", "出川哲朗"]
	let doArray: [String] = ["大爆発しました", "鬼を退治しました", "キスをしました"]

「いつ、どこで、誰が、誰と、何をした」という5つの配列を作りました。

それぞれに3つずつ内容を入れています。

例えば、一番上の『whenArray』は下記のように定義しています。

先頭のletはいつものです。次の『whenArray』が配列の名前です。

『 [String] 』は種類(型)です。Stringを[ ]で挟んでいるのがポイントで、こうすると配列として箱が作られます。

『=』の右側が配列の中身です。String(文字列)なので””(ダブルクォーテーション)で括っています。それそれの要素はカンマで区切ります。

配列の中身には『何番目』という形でアクセスできます。例えば、whenArrayの0番目にアクセスしたい時は、

whenArray[0]

と書きます。配列の番目は0から始まります。要素が3つある時は、0~2になります。

label.text = whenArray[2]

と書けば、label.textには”1週間前”が代入されます。

↓2番目に”1週間”が入ってますね。”遠い遠い昔”は0番目です。

日常では最初のものを1番目と言いますが、プログラミングの世界では0番目と言います。慣れてください。

なお、配列の内容が3つしかないのに

whenArray[5]

などと書き、範囲を越える要素にアクセスしようとするとエラーになります。whenArray[-1]も範囲を逸脱しているのでエラーになります。

5.乱数(ランダムな数字)を発生させるファンクション

今回作るアプリは作文ゲームで、定義した配列の中からランダムに文字列を選び出して文章を作ります。

ということは、ランダムな数字を作らなくてはいけません。

そのために作ったのが、『random』という『ファンクション』です。いわば電子サイコロです。

ファンクションとは、機能のことです。

『func』は、ファンクションを定義します、という意味です。変数の時に書いたletやvarみたいなもんです。

次の『random』がファンクションの名前です。

( )の中身は『引数(ひきすう)』というもので、ファンクションに入力する値を定義します。

ここでは、limitという引数を使っています。0からlimit未満の乱数(ランダムな数字)が欲しいという意味で、3を入力すれば、0か1か2のどれかを返します。

100を入力すれば、0~99までのどれかをランダムに返します。

->の次は返り値(かえりち)の種類です。返り値とは、ファンクションの結果として返す値、結果のことです。

ここでは『->Int』と書いているので整数を返します。

ファンクションの{}の中に処理を書きます。

今回は1行しかなくて、『return』のところで返り値を返しています。

『return』が実行されるとそこでファンクションは終わり、呼び出したところに戻ります。

『Int(arc4random() % UInt32(limit))』の部分で乱数を求めていますが、意味が分からなくても大丈夫です。書き写してください。

要は、これはlimitで決められた上限以内の乱数を返すファンクションということです。このファンクションを使って文章をランダムに組み立てます。

6.作文ボタンを押したときの処理

上の5行で、各配列に対応する乱数を求めています。打ち込むのが面倒な方は下記をコピペしてください。

let strSentence:String = whenArray[whenNumber] + "、 " + whereArray[whereNumber] + "で" + whoArray[whoNumber] + "と" + whoArray2[whoNumber2] + "が" + doArray[doNumber]

3を入力してファンクション『random』を呼び出しているので、5つの変数(whenNumberやwhereNumberなど)には0か1か2のどれかが入っています。

ランダムな数字を使って各配列の文字列を連結するとランダムな面白作文ができ上がります。

7.文字列は足し算で連結する

数字は1+3で4という答えになりますが、文字列は、”おはよう” + “ございます”で、”おはようございます”になります。

文字列の場合、+は連結を意味します。

数字の1+3は4ですが、文字列の”1″ + “3” は”13″です。

『いつ、どこで、だれと、だれが、何をした』という文章を作るためには、下のように連結します。

strSentenceに連結された作文が入ります。

これを最後にtvSentence.textにセットして画面に表示します。

実行してみてください。

ボタンを押すたびにランダムな文章が作られましたか?

8.配列の要素数が変わるとどうなるか?

ここまで、各配列に3つの要素を入れて作文してみました。

でも、3つだとバリエーションが少ないので、例えば『いつ』と『どこで』の要素数を増やしてみましょう。

下のように、7つに増やしてください。それぞれの要素の中身は各自自由に入力してください。

要素を増やしたらサイコロの上限も変更する必要があります。

要素が7つなら、0~6の乱数が必要ですから、randomに渡す引数を7にします。

サイコロの上限を増やさないと追加した文が使われませんからね。

でもこれ、面倒ですよね。

間違って10にしたら3分の1の確率でアプリが落ちますし、6にしたら7つ目の要素は絶対に出てこなくなります。

この程度なら間違わずに入力できるかもしれませんが、数が増えてくると間違いの原因になります。

そこで、配列の要素数が自動でrandomの引数になるようにプログラムを変更しましょう。

配列の要素数を得るには、『配列名.count』と書きます。

whenArrayの要素数を知りたいなら

whenArray.count

と書きます。

これで、7要素なら7が、5要素なら5がrandomに入力されます。

他の配列に対しても、要素数がrandomに入るようにしてください。

コピペでいいのですが、ペースト後に配列名を直し忘れたり、違う名前にしたりというミスがあります。よく確認してください。

いつ、どこで、以外の配列も7つ程度に要素を増やしてください。

変更が終わったら実行してみてください。

意図通りに動きましたか?

9.復習と応用 しゃべるようにしてみましょう

作文ができるようになったら、できた文章をしゃべらせてみましょう。

作文ボタンを押したら内容をしゃべるようにしてください。

Lesson3の内容を使えば簡単にできますよね!

10.復習と応用の正解


戻る