You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用saveChanges时EventStore的allEvents数组显示为nil的问题求助

问题排查与解决方案

1. 检查是否使用了多个EventStore实例

这是最可能的核心原因:如果创建事件时用了一个EventStore对象,调用saveChanges时又新建了另一个实例,新实例的allEvents会是初始化后的空数组(或读取的旧数据),而非你添加过新事件的数组。

解决方法:把EventStore改成单例,确保整个App共用同一个实例:

class EventStore {
    static let shared = EventStore()
    private init() {} // 禁止外部创建新实例
    
    var allEvents = [Event]()
    // 其余代码保持不变
}

// 调用时统一使用单例
EventStore.shared.createEvent(date: Date(), event: "测试事件")
EventStore.shared.saveChanges()

2. 确认Event类遵循Codable协议

PropertyListEncoder/Decoder要求被编码的对象必须实现Codable协议(包含Encodable和Decodable),如果你的Event类未遵循该协议,会导致编码失败,甚至间接引发数组数据异常。

示例正确的Event类定义:

class Event: Codable {
    var date: Date?
    var event: String
    
    init(date: Date?, event: String) {
        self.date = date
        self.event = event
    }
}

如果Event包含非Codable属性,需通过CodingKeys枚举忽略该属性,或让属性本身也遵循Codable。

3. 验证实例一致性(调试技巧)

在createEvent和saveChanges方法中添加实例地址打印,确认两个方法调用的是同一个实例:

@discardableResult func createEvent(date: Date?, event: String) -> Event {
    print("createEvent 实例地址: \(Unmanaged.passUnretained(self).toOpaque())")
    // 原有代码...
}

func saveChanges() -> Bool {
    print("saveChanges 实例地址: \(Unmanaged.passUnretained(self).toOpaque())")
    // 原有代码...
}

如果两个地址不同,说明确实使用了多个实例,按照单例方案修改即可。


内容的提问来源于stack exchange,提问作者Brian Richey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 18:12:53