以前もSwiftの実践トレーニングのため、迫さんの記事を参考にいくつかのクソアプリを練習で作っていたのだが、最近SwiftUIの勉強を始めたので最新版のSwift5 + SwiftUIでクソアプリを作ってみることにした。

今回作ったのは、いわゆるハイアンドローアプリ。

0から100の乱数を裏で用意し、ユーザーに整数の入力を求め、何回目で当てることができるかという単純なゲームアプリだ。

出来上がったアプリがこちら。

ユーザーはTextFieldに0から100の値を入力し、Check!!ボタンを押す。

アプリ側では受け取った値が入力されているか、整数か、0以上100以下か、などを判定し、また正解値が入力値より高いか、低いかを条件分岐で出し分ける。

見事正解した場合は、何回目の回答で当てられらたかを出力する、といった仕様だ。

Githubにもアップしているが、作成したコードをここにも載せておこう。

import SwiftUI

struct ContentView: View {
    @State private var score: Int = Int(arc4random_uniform(101))
    @State private var counter: Int = 1
    @State private var input: String = ""
    @State private var message: String = ""
    
    var body: some View {
        VStack {
            Text("僕のテストは何点だったでしょう?")
            TextField("0〜100を入力", text: $input)
                .padding()
                .multilineTextAlignment(.center)
                .keyboardType(.numberPad)
                .padding()
            Button(action: {
                self.checkScore(inputScore: self.input)
            }) {
                Text("Check!!")
            }
                .padding()
            Text(message)
                .padding()
            Button(action: {
                self.initScore()
            }) {
                Text("もう一度やり直す")
            }
                .padding()
        }
    }
    
    func checkScore(inputScore: String) {
        if inputScore == "" {
            message = "何も入力されていません!"
            return
        } else {
            if let inputScoreInt = Int(inputScore) {
                if inputScoreInt > 100 {
                    message = "100以下の値を入力してください"
                } else if inputScoreInt < 0 {
                    message = "0以上の値を入力してください"
                } else if inputScoreInt == score {
                    message = "正解!\(counter)回目で当たりました!"
                } else if inputScoreInt > score {
                    message = "惜しい!もっと低かった"
                    counter += 1
                } else if inputScoreInt < score {
                    message = "惜しい!もっと高かった"
                    counter += 1
                }
            } else {
                message = "0から100の整数を入力してください"
            }
            
        }
    }
    
    func initScore() {
        self.score = Int(arc4random_uniform(101))
        self.counter = 1
        self.message = ""
        self.input = ""
    }
    
}

メインとなる処理がcheckScore関数で、if文による条件分岐でmessage変数に出力する値を出しわけている。

また正解した後、もう一度ゲームをプレイする時のために、乱数とカウンターを初期化するinitScore関数も用意した。

全体を通して特に複雑な処理はなく、サクッと作れるアプリだったので久しぶりにSwiftを触った肩慣らしとしては十分の実践練習となった。