Swift 数据采集器格式错误

Swift 数据采集器格式错误,swift,nsuserdefaults,datapicker,Swift,Nsuserdefaults,Datapicker,但是当我运行应用程序时,它返回这个错误 无法将类型为“\uu NSCFString”(0x108e8b4f0)的值强制转换为“NSDate”(0x108e8c0d0) 我转换为HH:mm是因为我只想用这种格式记录时间,但我不知道如何处理它您应该将日期对象本身存储在UserDefaults中,而不是它的字符串表示形式中。在大多数用例中,存储Date对象更有意义,因为Date对象表示一个绝对时间点,因此您可以使用它们进行日期比较或将其转换为本地时间 此外,setDate函数实际上需要一个Date对象

但是当我运行应用程序时,它返回这个错误

无法将类型为“\uu NSCFString”(0x108e8b4f0)的值强制转换为“NSDate”(0x108e8c0d0)


我转换为HH:mm是因为我只想用这种格式记录时间,但我不知道如何处理它

您应该将日期对象本身存储在
UserDefaults
中,而不是它的字符串表示形式中。在大多数用例中,存储
Date
对象更有意义,因为
Date
对象表示一个绝对时间点,因此您可以使用它们进行日期比较或将其转换为本地时间

此外,
setDate
函数实际上需要一个
Date
对象,而不是字符串,因此生成日期的字符串表示,然后将其存储在
UserDefaults
中是没有意义的

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm "

let selectedDate = dateFormatter.string(from: sender.date)

UserDefaults.standard.set(selectedDate, forKey: "date")
print(selectedDate)

\\method to reload the selected time inside the viewdidLoad func

let selectedDate = UserDefaults.standard.object(forKey: "date")
example.setDate(selectedDate as! Date ?? Date(), animated: false)

您是否将字符串值保存在
UserDefaults
中,并尝试从字符串设置
NSDate
。如果您只关心时间,那么我建议您将日期保存在
UserDefaults
中,并根据您的要求将
time
格式化

以下是保存和检索时间的步骤:

//Save the Date object
UserDefaults.standard.set(sender.date, forKey: "date")

//Retrieve the Date object, if it cannot be retrieved, use the current Date
if let selectedDate = UserDefaults.standard.object(forKey: "date") as? Date {
    example.setDate(selectedDate, animated: false)
} else {
    example.setDate(Date(), animated: false)
}
   func datePickerChanged(_ sender: UIDatePicker){

    UserDefaults.standard.set(sender.date, forKey: "date")

}
用于保存:

//Save the Date object
UserDefaults.standard.set(sender.date, forKey: "date")

//Retrieve the Date object, if it cannot be retrieved, use the current Date
if let selectedDate = UserDefaults.standard.object(forKey: "date") as? Date {
    example.setDate(selectedDate, animated: false)
} else {
    example.setDate(Date(), animated: false)
}
   func datePickerChanged(_ sender: UIDatePicker){

    UserDefaults.standard.set(sender.date, forKey: "date")

}
用于检索:

//Save the Date object
UserDefaults.standard.set(sender.date, forKey: "date")

//Retrieve the Date object, if it cannot be retrieved, use the current Date
if let selectedDate = UserDefaults.standard.object(forKey: "date") as? Date {
    example.setDate(selectedDate, animated: false)
} else {
    example.setDate(Date(), animated: false)
}
   func datePickerChanged(_ sender: UIDatePicker){

    UserDefaults.standard.set(sender.date, forKey: "date")

}

希望它能帮助你,节省你的时间

您将日期存储为
UserDefaults
中的
String
,因此您将其返回为类型“\uu NSCFString”而不是“NSDate”,并且无法将其强制转换为
date
。现在还不清楚你将要完成什么。为什么要费心于所有的日期字符串转换呢?只需存储实际的
日期
,并避免所有转换。@rmaddy是的,转换时间很长,但我已更新了答案。非常感谢。