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

目次 通常版

 ハイアンドローゲーム1の解説です。

//
//  ViewController.swift
//  Hi and Lo
//
//  Created by 保 Tabei on 2024/09/22.
//

import UIKit

class ViewController: UIViewController {

    ///ガイドラベル
    @IBOutlet weak var Guide: UILabel!
    ///入力フィールド(0〜9を入れる)
    @IBOutlet weak var Input: UITextField!
    
    ///乱数発生(0〜9の間でランダムな数値を発生させる)
    var randInt = Int.random(in: 0 ..< 10)
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        //ガイドラベルに案内表示
        Guide.text = "0~9の数字を入れてボタンを押して下さい"
    }

    ///ボタン押下時処理
    @IBAction func TouchBtnGo(_ sender: Any) {
        //入力フィールドに入れた値を数値としてval変数に入れる
        let val = Int(Input.text!)!
        //入力値と乱数を比べて入力値が大きい場合
        if val > randInt {
            Guide.text = "もっと小さいです"
        }
        //入力値と乱数を比べて入力値が小さい場合
        else if val < randInt {
            Guide.text = "もっと大きいです"
        }
        //上記以外、等しい時
        else {
            Guide.text = "当たりです"
        }
    }
    
}

 LabelとText Fieldをソースコードで扱えるようにする部分は、良いですね。もし解らなかったら第3回を参照して下さい。

 Buttonを押した時の処理を書けるようにする部分も良いですね。これも第3回を参照して下さい。

さて

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

ですが、ここは少し難しいと思います。先に答えを言ってしまうと、ここで0~9までの乱数(ランダムな数)を発生させてrandIntという変数に代入しています。ここでIntは何でしょうか。Intは、通常の整数型で、標準の型となります。

    var i = 0

とすると、i はInt型になります。

    var i:Int = 0

と書いたのと同じになります。変数には必ず型があって、整数型、文字列型、bool型等、どの型か指定する必要があります。この値を指定した時は、Int型とかbool型とかあって、型の指定を省略する事が出来る場合があります。

    var randInt = Int.random(in: 0 ... 9)

ここの記述は、この様にしても同じになります。これも0〜9となります。

 コンピュータの場合扱える桁数が有限です。CPUの進化に合わせて、扱える桁数が増えてきました。ここでInt型というのは、そのパソコンで一番扱いやすい整数型となります。現在CPUはほとんどが64bitなので、IntはInt64(ー2の63乗~2の63乗ー1)となります。Int32はー2の31乗~2の31乗ー1です。ここでUInt32ですが最初のUはUnsignedを示し、符号なし(マイナス無し)となります。UInt32は0~2の32乗ー1となります。型の違いに寛容な言語もあるのですが、SwiftのようにC言語の流れを汲む言語は型の違いをはっきり意識して、見つかりにくいバグが潜むのを防いでいます。

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

 最初のvarで変数を宣言しています。ここではrandIntという変数を宣言しています。そして初期値として、0~9の乱数を格納しています。型はInt型です。乱数ですので、その都度値が変わり、0~9の中のどれかの数字が毎回入ります。最初のvarは、変数を意味しています。letが定数です。letでの指定が可能な所でvarを使うと警告が出る事が多いです。しかし、ここもletでの指定が可能な筈ですが、警告は出ない様です。

 続いて

        Guide.text = "0~9の数字を入れてボタンを押して下さい"

ですが、Guideのtextプロパティに”0~9の数字を入れてボタンを押して下さい”という文字列を代入しています。GuideというのはLabelに付けた名前です。Labelはいくつかのプロパティ(属性)を持っており、textプロパティはその一つで、Labelに表示する文字列を表します。GuideLabelに”0~9の数字を入れてボタンを押して下さい”を表示します。この部分、viewDidLoad内に書かれていますが、このviewDidLoadは、起動時の処理が終わったら呼ばれる関数で、最初に行いたい処理をここに書きます。

 続いて

        let val = Int(Input.text!)!

ですが、Inputというのは、TextFieldに付けた名前です。InputTextFieldのtextプロパティは、TextFieldに入っている文字列を表します。Input.textは型としてはString型(文字列型)となります。数値ではありません。

        let val = Input.text

そこで、このようにすると、変数valは文字列型になってしまい、整数型(Int型等)と直接比較できません。そこでInt()を付けてInt型に変換しています。Input.text!の最後の!ですが、Input.textはString?型となります。String?型はString型の値を取る他にnilという何も入っていないという値も取る事が出来ます。この!は無理やりString型に変換するという意味で、nilは取らないと指定しています。Int (Input .text!)!の最後の!はInt(Input.text!)だけですと、valはInt?型となり、整数の他にnilという特別な値も取れる型となるところを、nilを取ることが出来ないInt型にしています。nilというのは他の言語ではnullという場合が多いのですが、値無しを意味します。データベースで数値の他に、数値が入っていないという状態を示すのに良く使われます。ここでは、数値に変換出来ない空白や英字が入れられた場合にnilになります。

 次の

        if val > randInt {
            Guide.text = "もっと小さいです"
        }

ですが、val(ユーザーがTextFieldに入れた値を整数に変換したもの)とrandInt(最初に乱数として発生させた0~9の数値)を比較してvalの方が大きかったら、Guideのtextプロパティに”もっと小さいです”を入れています。ユーザーが入れた数値の方が大きいのですから、答えはもっと小さくなりますね。ここは比較的解りやすい所ではないでしょうか。ifはもしですし。

 次の

        else if val < randInt {
            Guide.text = "もっと大きいです"
        }

ですが、valとrandIntを比較してvalの方が小さかったら、Guideのtextプロパティに”もっと大きいです”を入れています。最初のelseは、それ以外という意味で、一つ前のval > randIntという条件に合わなかった時という意味です。

 次の

        else {
            Guide.text = "当たりです"
        }

ですが、それ以外というのは、大きくも小さくもない時ですから、もう一致する場合しか残っていませんね。Guideのtextプロパティに”当たりです”という文字列を入れています。

さて、皆さんに問題です。今回は0~9でしたが、これを0~19の当たりが出るようにするには、どこを変えれば良いでしょう。表示も変えるとすると2箇所変更する必要があります。

目次 通常版

コメントを残す

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

CAPTCHA