Swift中User Defaults存储数组重启APP后丢失问题求助
解决UserDefaults存储数组重启后丢失的问题
给你几个针对性的排查和解决方向:
检查数组初始化与读取的顺序
新手常犯的错误:启动APP时先将clientArray初始化为空数组,再去读取UserDefaults的值,导致读取到的内容被空数组覆盖。正确顺序是先读取,再处理空值情况:var clientArray: [String] = [] override func viewDidLoad() { super.viewDidLoad() // 先读取存储值,再赋值给数组 if let savedClients = UserDefaults.standard.stringArray(forKey: "ClientArrayKey") { clientArray = savedClients } // 避免先执行clientArray = []再读取 }使用对应类型的读取方法,避免类型转换失败
你存储的是字符串数组,不要用array(forKey:)(返回[Any]?),改用stringArray(forKey:)更安全——如果存储的内容不是纯字符串数组,array(forKey:)转[String]会失败,导致得到空数组。存储和读取示例:// 存储更新后的数组 UserDefaults.standard.set(clientArray, forKey: "ClientArrayKey") // 读取字符串数组 if let clients = UserDefaults.standard.stringArray(forKey: "ClientArrayKey") { clientArray = clients }确认数组更新后立即执行存储操作
给clientArray添加新客户名称后,必须立刻将更新后的数组存回UserDefaults,比如弹窗确认后的代码:// 假设从弹窗获取到newClientName clientArray.append(newClientName) // 立即存储 UserDefaults.standard.set(clientArray, forKey: "ClientArrayKey") // 调试场景下可手动调用同步(iOS 10+自动同步,但调试时更保险) UserDefaults.standard.synchronize()检查存储和读取的键名是否完全一致
键名的大小写、拼写必须完全匹配,比如存的时候用"ClientList",读的时候用"clientList"会直接返回nil,导致数组为空。排查是否存在意外清空的逻辑
检查代码中有没有其他地方调用removeObject(forKey:)或set(nil, forKey:)清空了这个键的值,比如页面退出、重置功能里的误操作。
内容的提问来源于stack exchange,提问作者Miguel Carvalho
相关产品推荐
相关产品推荐

