新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箇所変更する必要があります。