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