新Swiftで行こう…第8回「ハイアンドローゲーム5」 田部井保

目次 解説編

 前回の問題の答えです。
 1番目の問題は、実際に試してみましょう。 まず、前回完成したものを実行してみましょう。もう既に試されているとは思いますが。 さて、ここでLevelChange関数を無効にしてみましょう。セグメンテッドコントロールを選択して、右上の一番右のアイコンをクリックして、Value Changedの所の×マークをクリックします。

 以下のようになります。Value Changedの右側にあった◉が○に変わりました。

LevelChange関数の左側にあった◉も○に変わりました。

 reset()関数をコメント化するだけでも良いです。コメントは頭に//を付けるとコメントになり、単なる 注釈になって命令と見なされなくなります。

    @IBAction func LevelChange(_ sender: Any)
    {
        //reset()
    }
 

 これで実行すると、セグメンテッドコントロールを操作しても何も変わらなくなります。1ゲーム終了 すると反映されるようになります。そういう仕様でも良いとは思いますが、コントロールを変更してい るのに何も変化が無いというのは、使っている人が戸惑うかと思い、LevelChange関数を加えました。

 それでは×マークをクリックした方は、セグメンテッドコントロールを選択して、また右上の一番右のア イコンをクリックし、Value Changedの右の⚪︎からコード領域のLevelChangeの所までドラッグ&ドロップして再リンクします。

 このようになったでしょうか?LevelChange関数の左側にあった○が◉に変わりました。

 2番目の問題です。

            randInt = Int.random(in: 0 ..< 10)

            randInt = Int.random(in: 0 ..< 20)
  

の部分をまとめられないでしょうか? 以下のようにまとめてみました。

以下、問題の部分のソースコードです。

    func reset()
    {
        var lv = 0
        if Level.selectedSegmentIndex == 0 {
            lv = 10
            Guide.text = "0~9の数字を入れてボタンを押して下さい"
        } else {
            lv = 20
            Guide.text = "0~19の数字を入れてボタンを押して下さい"
        }
        randInt = Int.random(in: 0 ..< lv)
        cnt = 0
        Count.text = "0回目"
    }

 さらにGuideラベルに表示する文字もまとめられないでしょうか? 以下のようにまとめてみました。

 以下、問題の部分のソースコードです。

    func reset()
    {
        var lv = 0
        if Level.selectedSegmentIndex == 0 {
            lv = 10
            //Guide.text = "0~9の数字を入れてボタンを押して下さい"
        } else {
            lv = 20
            //Guide.text = "0~19の数字を入れてボタンを押して下さい"
        }
        randInt = Int.random(in: 0 ..< lv)
        Guide.text = "0~" + (lv-1).description + "の数字を入れてボタンを押して下さい"
        cnt = 0
        Count.text = "0回目"
    }

 6、9行目は、違いが分かる様にコメントにしました。削除してしまっても構いません。

 さらに10、20も自動的に生成するようにしました。

 以下、問題の部分のソースコードです。

    func reset()
    {
        let lv = (Level.selectedSegmentIndex + 1) * 10
        randInt = Int.random(in: 0 ..< lv)
        Guide.text = "0~" + (lv-1).description + "の数字を入れてボタンを押して下さい"
        cnt = 0
        Count.text = "0回目"
    }

 これでシンプルにはなったのですが、最後の修正は余計だと僕は思います。確かにシンプルにはなった かも知れませんが、ソースコードが解りにくくなってしまいました。その一つ前までの修正に止めておいた方が良いと思います。初級を10、中級を20としましたが、その一つ前の修正なら初級は10のままで中級を50等とする事が出来ます。

 文章も設定した数値-1で自動的に入るので、設定した数値だけ を変えて文章を変え忘れたという事もなくなります。

 解りやすいという点では、以下のように修正するのも良いかもしれません。

 以下、問題の部分のソースコードです。

    func reset()
    {
        var lv = 0
        if Level.titleForSegment(at:Level.selectedSegmentIndex) == "初級" {
            lv = 10
        } else {
            lv = 20
        }
        randInt = Int.random(in: 0 ..< lv)
        Guide.text = "0~" + (lv-1).description + "の数字を入れてボタンを押して下さい"
        cnt = 0
        Count.text = "0回目"
    }

 3番目の問題です。 ここでは、2番目の問題でまとめたものを元にします。もちろん、まとめていないものを改造しても良 いのですが少し大変です。ヒントで示したように、Segmentsの値を2から3に変えます。そして、 SegmentをSegment2にして、Titleに上級と入れます。

ソースコードを以下のように変更します。まとめてあると、修正が楽ですね。

以下、変更する部分のソースコードです。

    func reset()
    {
        var lv = 0
        if Level.selectedSegmentIndex == 0 {
            lv = 10
        } else if Level.selectedSegmentIndex == 1 {
            lv = 20
        } else {
            lv = 30
        }
        randInt = Int.random(in: 0 ..< lv)
        Guide.text = "0~" + (lv-1).description + "の数字を入れてボタンを押して下さい"
        cnt = 0
        Count.text = "0回目"
    }

 さて、今までは場合分けにif文を使っていましたが、ここでswitch文を使ってみます。以下のようにして みて下さい。if文とswitch文、適材適所で使い分けて下さい。このように同じ事をするにも色々なやり方 があります。そのうちのどれが良いかは解りやすい方とするのが良いと思います。

    func reset()
    {
        var lv = 0
        switch Level.selectedSegmentIndex {
        case 0:
            lv = 10
        case 1:
            lv = 20
        case 2:
            lv = 30
        default:
            lv = 10
        }
        randInt = Int.random(in: 0 ..< lv)
        Guide.text = "0~" + (lv-1).description + "の数字を入れてボタンを押して下さい"
        cnt = 0
        Count.text = "0回目"
    }

 解りやすいという事でソースコードを以下のように変えてみました。ただ、これも数値の方が解りやす いという人もいると思います。正解は一つではありません。

    func reset()
    {
        var lv = 0
        switch Level.titleForSegment(at:Level.selectedSegmentIndex) {
        case "初級":
            lv = 10
        case "中級":
            lv = 20
        case "上級":
            lv = 30
        default:
            lv = 10
        }
        randInt = Int.random(in: 0 ..< lv)
        Guide.text = "0~" + (lv-1).description + "の数字を入れてボタンを押して下さい"
        cnt = 0
        Count.text = "0回目"
    }

 switch文にdefault:という部分があって戸惑ったかも知れません。if文と同じにするなら以下の形になり ます。

    func reset()
    {
        var lv = 0
        switch Level.titleForSegment(at:Level.selectedSegmentIndex) {
        case "初級":
            lv = 10
        case "中級":
            lv = 20
        default:
            lv = 30
        }
        randInt = Int.random(in: 0 ..< lv)
        Guide.text = "0~" + (lv-1).description + "の数字を入れてボタンを押して下さい"
        cnt = 0
        Count.text = "0回目"
    }

 ただこれも上級(あるいは2)があった方が解りやすいかもという事で最初は付けていました。本当に書き方は色々あるというのを解って頂けたのではと思います。

目次 解説編

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA