调用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
相关产品推荐
相关产品推荐

