シングルトンやユーザーディフォルトからのデータを関数にまとたい
タイマーマネージャーのシングルトンを持ったピッカービューで時間を設定するタイマーを作っています。時間を扱うために合計時間を時間、分、秒へと分解する箇所が複数あり冗長だなと思うので関数に処理をまとめたいと思います。
しかし、元の合計時間がシングルトンから引っぱってきたものと、ユーザーディフォルトからのものとが混在してうまくまとめる方法が考えられないのです。
どなたかご教示いただければ幸いです。
該当のソースコード
Swift
1class TimerManager { 2 static let shared = TimerManager() 3 var timer : Timer? 4 var setCount: Double? = nil 5 var count = 0.0 6 var remainCount: Double? = nil { 7 didSet { 8 onCountDidSet?(remainCount!) 9 } 10 } 11 var onCountDidSet: ((_ count: Double) -> Void)? = nil 12 13 func startCount() { 14 if timer == nil { 15 timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { 16 timer in self.timerCount(timer)} 17 } 18 } 19 func stopCount() { 20 count = 0.0 21 pauseCount() 22 } 23 func pauseCount() { 24 if let nowTimer = timer { 25 if nowTimer.isValid == true { 26 nowTimer.invalidate() 27 } 28 self.timer = nil 29 } 30 } 31 func timerCount(_ timer: Timer) { 32 if let _ = UserDefaults.standard.object(forKey: "timer_value") as? Int { 33 setCount = (UserDefaults.standard.object(forKey: "timer_value")) as? Double 34 } 35 count += 1.0 36 if let set_count = setCount { 37 remainCount = set_count - count 38 } 39 if let remain_count = remainCount { 40 if remain_count <= 0.0 { 41 count = 0.0 42 timer.invalidate() 43 print("finish") 44 } 45 } 46 } 47 var timer_status = "stop" 48 func timerStatus() { 49 if timer == nil { 50 timer_status = "stop" 51 } 52 else { 53 timer_status = "counting" 54 } 55 } 56} 57--------------------------------------------- 58class ViewController: UIViewController { 59 60 var alertController = UIAlertController() 61 @IBOutlet weak var countDownLabel: UILabel! 62 @IBAction func settingButtonAction(_ sender: Any) { 63 } 64 @IBAction func startButtonAction(_ sender: Any) { 65 TimerManager.shared.startCount() 66 } 67 @IBAction func stopButtonAction(_ sender: Any) { 68 TimerManager.shared.pauseCount() 69 } 70 var remain_counts = 0 71 72 func remainCount() { 73 TimerManager.shared.onCountDidSet = { 74 remainCount in self.remain_counts = Int(remainCount) 75 let hour = self.remain_counts / 3600 76 let mHour = self.remain_counts % 3600 77 let minites = mHour / 60 78 let sMinites = mHour % 60 79 let second = sMinites % 60 80 print(hour,minites, second) 81 self.countDownLabel.text = "残り (hour) 時間 (minites) 分 (second) 秒" 82 if remainCount <= 0.0 { 83 self.returnData() 84 } 85 } 86 } 87 88 func returnData(){ 89 self.alert(title: "終了", 90 message: "終了です") 91 } 92 func alert(title: String, message: String) { 93 alertController = UIAlertController(title: title, message: message, preferredStyle: .alert) 94 alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 95 present(alertController, animated: true) 96 } 97 98 override func viewDidLoad() { 99 super.viewDidLoad() 100 101 // 画面遷移時のタイマー作動/停止で表示を変える 102 TimerManager.shared.timerStatus() 103 let nowCount = TimerManager.shared.timer_status 104 let presenceCount = TimerManager.shared.count 105 106 // タイマー停止状態を判断 107 if nowCount == "stop" { 108 // カウンターもリセットされている(一時停止ではない) 109 if presenceCount == 0.0 { 110 if let time_value = UserDefaults.standard.object(forKey: "timer_value") as? Int { 111 print(time_value) 112 let hour = time_value / 3600 113 let mHour = time_value % 3600 114 let minites = mHour / 60 115 let sMinites = mHour % 60 116 let second = sMinites % 60 117 print(hour,minites, second) 118 countDownLabel.text = "残り (hour) 時間 (minites) 分 (second) 秒" 119 } else { 120 // 一時停止なら残り時間を表示 121 remainCount() 122 } 123 } 124 // タイマーが動いていれば残り時間を表示 125 } else { 126 remainCount() 127 } 128 } 129 130 override func viewWillAppear(_ animated: Bool) { 131 super.viewWillAppear(animated) 132 remainCount() 133 } 134 override func viewWillDisappear(_ animated: Bool) { 135 super.viewWillDisappear(animated) 136 TimerManager.shared.onCountDidSet = nil 137 } 138 139 override func viewDidAppear(_ animated: Bool) { 140 TimerManager.shared.timerStatus() 141 let nowCount = TimerManager.shared.timer_status 142 let presenceCount = TimerManager.shared.count 143 144 if nowCount == "stop" { 145 if presenceCount == 0.0 { 146 if let time_value = UserDefaults.standard.object(forKey: "timer_value") as? Int { 147 print(time_value) 148 let hour = time_value / 3600 149 let mHour = time_value % 3600 150 let minites = mHour / 60 151 let sMinites = mHour % 60 152 let second = sMinites % 60 153 print(hour,minites, second) 154 countDownLabel.text = "残り (hour) 時間 (minites) 分 (second) 秒" 155 // countDownLabel.text = String(time_value) 156 // print(time_value) 157 } else { 158 remainCount() 159 } 160 } 161 } else { 162 remainCount() 163 } 164 } 165} 166 167 func disassembly (value: Double) { 168 let value = Int(value) 169 let hour = value / 3600 170 let mHour = value % 3600 171 let minites = mHour / 60 172 let sMinites = mHour % 60 173 let second = sMinites % 60 174 self.countDownLabel.text = "残り (hour) 時間 (minites) 分 (second) 秒" 175 }
試したこと
最後のfunc disasseemblyのところのような関数を作ろうとしたのですが、シングルトンやユーザーディフォルトの理解が不十分であることはわかっています。色々なサイトから自分なりにまとめていったのですが、今の自分の頭では限界がきたためどなたかアドバイスいただければと思います。
補足情報(FW/ツールのバージョンなど)
x code 10.2.1 swift5.0.1 macOs Mojave 10.14.5
回答1件
あなたの回答
tips
プレビュー