エラー「Cannot convert value of type 'Data?' to expected argument type 'Date'」について
現在、単純なカウントダウンタイマーアプリを作っております。
カウントダウンの途中で「stop」で一時停止し,「start」で再スタートしたいのですがCannot convert value of type 'Data?' to expected argument type 'Date'
と言うエラーの意味がわからずつまずいてます。このエラーを治すにはどのような処置を行えばよろしいでしょうか。
画面をコントロールするクラス↓↓
import UIKit
func secondsToTimerLabel(_ seconds : Int) -> String {
let min = seconds / 60
let sec = seconds % 60
return String(format: "%02d : %02d", min, sec)
}
class NextViewController: UIViewController {
@IBOutlet weak var countdwonTimer: UILabel!
@IBOutlet weak var executionTimer: UILabel!
@IBOutlet weak var stopButton: UIButton!
@IBOutlet weak var kyannseruButton: UIButton!
@IBOutlet weak var twentyButton: UIButton!
@IBOutlet weak var thirtyButton: UIButton!
@IBOutlet weak var sixtyButton: UIButton!
@IBOutlet weak var ninetyButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
stopButton.layer.cornerRadius = 30.0
kyannseruButton.layer.cornerRadius = 30.0
twentyButton.layer.cornerRadius = 22.5
thirtyButton.layer.cornerRadius = 22.5
sixtyButton.layer.cornerRadius = 22.5
ninetyButton.layer.cornerRadius = 22.5
self.executionTimer.text = secondsToTimerLabel(TimerManager.shared.count)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
TimerManager.shared.onCountDidSet = { count in
self.executionTimer.text = secondsToTimerLabel(Int(count))
}
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
TimerManager.shared.onCountDidSet = nil
}
@IBAction func stopButtonAction(_ sender: UIButton) {
if TimerManager.shared.isRunning {
if TimerManager.shared.timer?.isValid == true{
TimerManager.shared.stop()
stopButton.setTitle("start", for: .normal)
twentyButton.isUserInteractionEnabled = true
thirtyButton.isUserInteractionEnabled = true
sixtyButton.isUserInteractionEnabled = true
ninetyButton.isUserInteractionEnabled = true
print("111111111111111")
} else {
TimerManager.shared.restartCount()
stopButton.setTitle("stop", for: .normal)
twentyButton.isUserInteractionEnabled = false
thirtyButton.isUserInteractionEnabled = false
sixtyButton.isUserInteractionEnabled = false
ninetyButton.isUserInteractionEnabled = false
print("222222222222222222")
}
} else {
TimerManager.shared.startCount()
stopButton.setTitle("stop", for: .normal)
twentyButton.isUserInteractionEnabled = false
thirtyButton.isUserInteractionEnabled = false
sixtyButton.isUserInteractionEnabled = false
ninetyButton.isUserInteractionEnabled = false
print("3333333333333333333")
}
}
@IBAction func cancelButtonAction(_ sender: UIButton) {
TimerManager.shared.cancel()
twentyButton.isUserInteractionEnabled = true
thirtyButton.isUserInteractionEnabled = true
sixtyButton.isUserInteractionEnabled = true
ninetyButton.isUserInteractionEnabled = true
TimerManager.shared.count = 0
self.executionTimer.text = secondsToTimerLabel(0)
stopButton.setTitle("start", for: .normal)
}
@IBAction func twentyButtonAction(_ sender: UIButton) {
self.executionTimer.text = secondsToTimerLabel(1200)
TimerManager.shared.nowNumber = 20
}
@IBAction func thertyButtonActiojn(_ sender: UIButton) {
self.executionTimer.text = secondsToTimerLabel(1800)
TimerManager.shared.nowNumber = 30
}
@IBAction func sixtyButtonAction(_ sender: UIButton) {
self.executionTimer.text = secondsToTimerLabel(3600)
TimerManager.shared.nowNumber = 60
}
@IBAction func ninetyButtonAction(_ sender: UIButton) {
self.executionTimer.text = secondsToTimerLabel(5400)
TimerManager.shared.nowNumber = 90
}
}
問題のクラスです↓↓、タイマーを司るクラスです↓↓
import UIKit
class TimerManager {
static var shared = TimerManager()
let settingKey = "timer_value"
let settingKeytwenty = "timer_twenty"
let settingKeythirty = "timer_thirty"
let settingKeysixty = "timer_sixty"
let settingKeyninety = "timer_ninety"
var timer : Timer?
var startDate : Date?
var restartDate : Data?
var count = 0 {
didSet {
onCountDidSet?(Double(count))
}
}
var onCountDidSet : ((_ count : Double) -> Void)? = nil
var nowNumber : Int = 0
var restartBool : Bool = false
init () {
let settings = UserDefaults.standard
settings.register(defaults: [settingKey : 216000])
let settings20 = UserDefaults.standard
settings20.register(defaults: [settingKeytwenty : 1200])
let settings30 = UserDefaults.standard
settings30.register(defaults: [settingKeythirty : 1800])
let settings60 = UserDefaults.standard
settings60.register(defaults: [settingKeysixty : 3600])
let settings90 = UserDefaults.standard
settings90.register(defaults: [settingKeyninety : 5400])
}
func restartCount() {
restartDate = Data()
switch nowNumber {
case 20 :
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: { timer in self.twntytimer(timer)
})
case 30 :
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: {timer in self.thritytimer(timer)})
case 60 :
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: { timer in
self.sixtytimer(timer)})
case 90 :
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: { timer in
self.ninetytimer(timer)})
default :
print("Invalid value \(nowNumber)")
}
}
func startCount() {
startDate = Date()
if timer == nil {
switch nowNumber {
case 20 :
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: { timer in self.twntytimer(timer)
})
case 30 :
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: {timer in self.thritytimer(timer)})
case 60 :
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: { timer in
self.sixtytimer(timer)})
case 90 :
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: { timer in
self.ninetytimer(timer)})
default :
print("Invalid value \(nowNumber)")
}
}
}
func stop() {
timer?.invalidate()
}
func cancel() {
timer?.invalidate()
timer = nil
}
var isRunning : Bool {
return timer != nil
}
func twntytimer(_ timer : Timer) {
let now = Date()
let sitting = UserDefaults.standard
let timeValue = sitting.integer(forKey: settingKeytwenty)
if restartBool != true {
guard let startDate = startDate else {
return
}
let dateDifference = now.timeIntervalSince(startDate)
count = timeValue - Int(dateDifference)
} else {
guard let restartDates = restartDate else {
return
}
let dateDifference = now.timeIntervalSince(restartDate)
count = timeValue - Int(dateDifference) //問題のエラーはここです!!エラー[Cannot convert value of type 'Data?' to expected argument type 'Date']
}
if count <= 0 {
self.timer?.invalidate()
count = 0
self.timer = nil
}
}
func thritytimer (_ timer : Timer) { //現在途中、上のtwntytimerが成功したら同じような仕様にするつもりです
guard let startDate = startDate else {
return
}
let now = Date()
let dateDifference = now.timeIntervalSince(startDate)
let sitting = UserDefaults.standard
let timeValue = sitting.integer(forKey: settingKeythirty)
count = timeValue - Int(dateDifference)
if count <= 0 {
self.timer?.invalidate()
count = 0
self.timer = nil
}
}
func sixtytimer(_ timer : Timer) { //現在途中、上のtwntytimerが成功したら同じような仕様にするつもりです
guard let startDate = startDate else {
return
}
let now = Date()
let dateDifference = now.timeIntervalSince(startDate)
let sitting = UserDefaults.standard
let timeValue = sitting.integer(forKey: settingKeysixty)
count = timeValue - Int(dateDifference)
if count <= 0 {
self.timer?.invalidate()
count = 0
self.timer = nil
}
}
func ninetytimer(_ timer : Timer) { //現在途中、上のtwntytimerが成功したら同じような仕様にするつもりです
guard let startDate = startDate else {
return
}
let now = Date()
let dateDifference = now.timeIntervalSince(startDate)
let sitting = UserDefaults.standard
let timeValue = sitting.integer(forKey: settingKeyninety)
count = timeValue - Int(dateDifference)
if count <= 0 {
self.timer?.invalidate()
count = 0
self.timer = nil
}
}
}