我正在尝试将BPM计数器实现为基本iOS应用。
我正在XCode项目中使用此实现,将addTap
方法连接到屏幕按钮。
但是,我收到错误。
super.init在从初始化器swift返回之前,并未在所有路径上调用。
因此,按照我在这里搜索发现的答案之后,我意识到我必须按照UiviewController类中定义的super.init()
。
我已经做到了,如下所示 - 但是现在我得到了另一个编译器错误
无法将'nscoder.type'类型的值转换为预期参数类型'nscoder'
我在下面粘贴的那一刻,tia
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var display: UILabel!
private let timeOutInterval: TimeInterval
private let minTaps: Int
private var taps: [Date] = []
init(timeOut: TimeInterval, minimumTaps: Int) {
timeOutInterval = timeOut
minTaps = minimumTaps
super.init(coder:NSCoder)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func addTap() -> Double? {
let thisTap = NSDate()
if let lastTap = taps.last {
if thisTap.timeIntervalSince(lastTap) > timeOutInterval {
taps.removeAll()
}
}
taps.append(thisTap as Date)
guard taps.count >= minTaps else { return nil }
guard let firstTap = taps.first else { return nil }
let avgIntervals = thisTap.timeIntervalSince(firstTap) / Double(taps.count - 1)
return 60.0 / avgIntervals
}
@IBAction func button(_ sender: Any) {
self.display.text = String(addTap())
}
}
您的问题与行:
super.init(coder:NSCoder)
参数需要是NSCoder
的实例,而不是类本身。但是您甚至不应该称呼该初始化器。
将该行更改为:
super.init(nibName: nil, bundle: nil)