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など新機能を勉強になりました。


こういうブログもありました。

人気のあるブログ:

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA


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