将日期组件数组设置为用户默认值不起作用



我正在制作一个单视图应用程序,用于管理一个人处理的所有任务。我有两个数组:一个存储所有任务名称,一个显示任务的完成时间。我将这两个都分配给用户默认值:

var tasks = [String]()
var finishingDates = [DateComponents]()
let defaults = UserDefaults()
class ViewController: UIViewController {
    func setDefaults() {
        defaults.set(tasks, forKey: "tasks")
        defaults.set(finishingDates, forKey: "finishingDates")
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        tasks = defaults.stringArray(forKey: "tasks") ?? [String]()
        finishingDates = defaults.array(forKey: "finishingDates") as? [DateComponents] ?? [DateComponents]()
    }

}

然后我测试以确保数组正常工作:

tasks = ["task"]
finishingDates = [DateComponents(calendar: calendar, year: 1910, month: 10, day: 1)]
setDefaults()

但是,当我运行它时,应用程序崩溃了。在应用委托中,存在 SIGABRT 错误。

我添加一个异常断点,它被调用到这一行:

defaults.set(finishingDates, forKey: "finishingDates")

它只在此行上调用,而不是在设置 String 数组的行上调用。除此之外,数组是相同的。我该如何解决这个问题?

不能将

DateComponents 对象的数组直接保存到 UserDefaults,但可以保存其数据。DateComponents 符合 Codable 协议,因此您只需要使用 JSONEncoder/JSONDecoder 对数组进行编码/解码并保存结果数据。顺便说一句,我建议将其写入JSON文本文件,而不是使用UserDefaults保留它:


游乐场测试:

var finishingDates: [DateComponents] = []
finishingDates.append(.init(calendar: .current, year: 2019, month: 7, day: 13))
finishingDates.first!.month!
do {
    let finishingDatesData = try JSONEncoder().encode(finishingDates)
    print(String(data: finishingDatesData, encoding: .utf8) ?? "")
    UserDefaults.standard.set(finishingDatesData, forKey: "finishingDates")
    print("finishingDates saved to userdefaults")
    if let data = UserDefaults.standard.data(forKey: "finishingDates") {
        let loadedDateComponents = try JSONDecoder().decode([DateComponents].self, from: data)
        print(loadedDateComponents)  // "[calendar: gregorian (fixed) year: 2019 month: 7 day: 13 isLeapMonth: false ]n"
    }
} catch { 
     print(error) 
}

这将打印:

"[{"日":13,"年":

2019,"日历":{"区域设置":{"标识符":"en_US"},"时区":{"标识符":"美国\/Sao_Paulo"},"标识符":"公历","最小天数在第一周":1,"第一个工作日":1},"月":7}]">

"[日历:公历(固定(年:2019 月:7 天:13 是闰月:假 ]">

最新更新