Problems getting around 'Super.init isn't called on all paths before returning from initializer swift.'

I'm trying to implement a BPM counter into a basic iOS app.

I'm using this implementation in an XCode project, connecting the addTap method to an onscreen button.

However, I receive the error.

Super.init isn't called on all paths before returning from initializer swift.

So following this answer I found by searching here, I realised I have to call super.init() as defined in the UIViewController class.

I've done that, as shown below - but now I'm getting another compiler error

Cannot convert value of type 'NSCoder.Type' to expected argument type 'NSCoder'

What I have at the minute is pasted below, 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())
}

}

Upvotes: 0

Views: 892

Answers (1)

rmaddy
rmaddy

Reputation: 318824

Your issue is with the line:

super.init(coder:NSCoder)

The parameter needs to be an instance of NSCoder, not the class itself. But you shouldn't even be calling that initializer.

Change that line to:

super.init(nibName: nil, bundle: nil)

Upvotes: 2

Related Questions