SwiftUIとCombineのTimerアプリを写経させてもらいます

こちらに分かりやすいサンプルの説明があり非常に有り難かったです。
写経終わった後、独自に機能を追加したりしましたが、分かりやすいコードのおかげです。ありがとうございます。

まずはサンプル通りに写経をさせてもらいました。1箇所だけ@mainの所がコンパイル通らなかったので下記のように修正しました。

import SwiftUI

@main
struct TimerTestApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView(viewModel: ContentViewModel())
        }
    }
}

ContentView()をContentView(viewModel: ContentViewModel())と書き換えました。

ここから少し機能追加しました

カウントアップして、ある値になったらカウンターを止めるという処理を追加しました。
(イメージとしてはDr.STONEでしたが、程遠い…)

ContentView.swift (抜粋)

Viewにカウントする最大値をセットするTextFieldを追加しました。

HStack(alignment: .center) {
                TextField("設定タイム", text: $viewModel.settedCount.IntToStrDef(0))
                    .font(.title2)
                    .textFieldStyle(RoundedBorderTextFieldStyle())
                    .frame(width: 50)
                Text("セコンド")
            }

ContentViewModel.swift (抜粋)

追加したタイマーの最大値を超えたらカウンターが止まるように追加・修正しました。

    @Published var count = 0 {
        didSet {
            checkCount()
        }
    }
    ...
    func checkCount() {
        // カウンターの値がセットしたカウントの値を超えるときTrueを返す
        if settedCount <= count {
            print("True")
            isTimeUP = true
            stopCounting()
        }
        else
        {
            print("False")
            isTimeUP = false
        }
    }

didSet()というメソッドは変数(プロパティ?)が変更された後にCallされると学びました。
isTimeUPというフラグも用意したけど要らなかったかな。

その他、参考にしたサイトです

今回、SwiftUIでやCombineなど新機能を勉強になりました。

鹿児島県の出水市という所に住んでいまして、インターネット周辺で色々活動して行きたいと思ってるところです。 Webサイト作ったり、サーバ設定したり、プログラムしたりしている、釣りと木工好きなMacユーザです。 今はデータサイエンスに興味を持って競馬AI予想を頑張ってます。

コメントを残す

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

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください