回答編集履歴
2
追記
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
answer
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
BPM = Beats per
|
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
|
```
|