teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記

2020/07/07 05:21

投稿

TsukubaDepot
TsukubaDepot

スコア5086

answer CHANGED
@@ -1,3 +1,7 @@
1
+ オリジナルのコードに基づく修正結果は後半に追記しました。
2
+
3
+ ---
4
+
1
5
  BPM = Beats per Minute なので、一分間の拍数(タップ回数)を計測すれば良いことになります。
2
6
 
3
7
  作られたプログラムだと、割り込みを 0.01秒ごとにかけてタップ回数を計測するような流れになっていますが(それ以上深く読んでいませんので、根本的な原因まではみていませんが)、上記の理屈を素直に解釈すれば、**1分後に起きる割り込みをかけて、その間に実行されたタップ回数を計測すれば良い**ということになります。
@@ -85,4 +89,59 @@
85
89
  bpmLabel.text = "BPMは (estimatedBPM) です"
86
90
  }
87
91
  }
92
+ ```
93
+ ---
94
+ # 追記
95
+
96
+ 思ったように動かない、というコードをきちんとみてみました。
97
+
98
+ タップ間の経過時間を計算した値で 60 を割ることによってリアルタイムで BPM を表示したいのだと理解しました(上で指摘した項目のうち、リアルタイムで計測することを実現しようとしている)。
99
+
100
+ 思うように動かない理由は
101
+ - 初回だけで良い Timer のインスタンスを毎回作っている(作っても多分動くが意味がない)
102
+ - `BPM` に入れるべき計算結果を `count` に入れて上書きしている
103
+ - タップごとに `count` をリセットしなければいけないのにリセットしていない
104
+
105
+ などがあります。
106
+
107
+ これらを修正すれば、概ね元の構造を残したまま動くようにすることは可能です。
108
+
109
+ ```Swift
110
+ import UIKit
111
+
112
+ class ViewController: UIViewController {
113
+
114
+ var count: Double = 0.00
115
+
116
+ var timer: Timer!
117
+ var BPM: Double!
118
+
119
+ @IBOutlet var timerLabel: UILabel!
120
+
121
+ override func viewDidLoad() {
122
+ super.viewDidLoad()
123
+ // Do any additional setup after loading the view.
124
+ }
125
+
126
+ @IBAction func start() {
127
+ // MARK: タイマは初回だけ起動
128
+ if timer == nil {
129
+ timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(ViewController.update), userInfo: nil, repeats: true)
130
+ } else {
131
+ // 秒数を count で割った値を BMP に代入
132
+ BPM = 60 / count
133
+ timerLabel.text = String(format: "%.2f", BPM)
134
+ // count はゼロにする
135
+ count = 0
136
+ }
137
+ }
138
+
139
+ @IBAction func stop() {
140
+ timer.invalidate()
141
+ }
142
+
143
+ @objc func update() {
144
+ count = count + 0.01
145
+ }
146
+ }
88
147
  ```

1

minuts -> minut

2020/07/07 05:21

投稿

TsukubaDepot
TsukubaDepot

スコア5086

answer CHANGED
@@ -1,4 +1,4 @@
1
- BPM = Beats per Minutes なので、一分間の拍数(タップ回数)を計測すれば良いことになります。
1
+ BPM = Beats per Minute なので、一分間の拍数(タップ回数)を計測すれば良いことになります。
2
2
 
3
3
  作られたプログラムだと、割り込みを 0.01秒ごとにかけてタップ回数を計測するような流れになっていますが(それ以上深く読んでいませんので、根本的な原因まではみていませんが)、上記の理屈を素直に解釈すれば、**1分後に起きる割り込みをかけて、その間に実行されたタップ回数を計測すれば良い**ということになります。
4
4
 
@@ -83,7 +83,6 @@
83
83
  let estimatedBPM = count * 6
84
84
 
85
85
  bpmLabel.text = "BPMは (estimatedBPM) です"
86
-
87
86
  }
88
87
  }
89
88
  ```