我有一个字典=字符串:([(字符串)],[(Int)],NSDate,Bool,[(字符串)])当我调用applicationWillTerminate
var codes = [(String)]()
var messages = [[String]]()
var senders = [[Int]]()
var dates = [(NSDate)]()
var bools = [(Bool)]()
var pairs = [[String]]()
for code in self.dictionary.keys {
codes.append(code)
messages.append(self.dictionary[code]!.0)
senders.append(self.dictionary[code]!.1)
dates.append(self.dictionary[code]!.2)
bools.append(self.dictionary[code]!.3)
pairs.append(self.dictionary[code]!.4)
}
self.userDefaultsMessages.setObject(codes, forKey: "userMessagesArrays")
self.userDefaultsSenders.setObject(messages, forKey: "userSentArrays")
self.userDefaultsDates.setObject(senders, forKey: "userDatesArray")
self.userDefaultsDeletedBool.setObject(dates, forKey: "userDeletedArrays")
self.userDefaultsPairs.setObject(bools, forKey: "userPairsArrays")
self.userDefaultsCodeKeys.setObject(pairs, forKey: "userCodesArrays")
self.userDefaultsCodeKeys.synchronize()
self.userDefaultsMessages.synchronize()
self.userDefaultsSenders.synchronize()
self.userDefaultsDates.synchronize()
self.userDefaultsDeletedBool.synchronize()
self.userDefaultsPairs.synchronize()
然后当app调用applicationDidBecomeActive
时,我尝试将它们全部拉回来//读 如果让savedCodesArray:AnyObject? = self.userDefaultsCodeKeys.objectForKey(" userCodesArrays"){ self.userCodes = savedCodesArray!如! [字符串]
if let savedMessagesArray : AnyObject? = self.userDefaultsCodeKeys.objectForKey("userMessagesArrays") {
self.Usermessages = savedMessagesArray! as! [[String]]
if let savedSendersArray : AnyObject? = self.userDefaultsCodeKeys.objectForKey("userSentArrays") {
self.Usersenders = savedSendersArray! as! [[Int]]
if let savedDatesArray : AnyObject? = self.userDefaultsCodeKeys.objectForKey("userDatesArray") {
self.Userdates = savedDatesArray! as! [NSDate]
if let savedBools : AnyObject? = self.userDefaultsCodeKeys.objectForKey("userDeletedArrays") {
self.Userbools = savedBools! as! [Bool]
if let savedPairs : AnyObject? = self.userDefaultsCodeKeys.objectForKey("userPairsArrays") {
self.Userpairs = savedPairs! as! [[String]]
var indexPath: Int = 0
for code in self.userCodes {
self.dictionary[code]! = [self.Usermessages[indexPath], self.Usermessages[indexPath], self.Userdates[indexPath], self.Userbools[indexPath], self.Userpairs[indexPath]]
}
}
}
}
}
}
}
我对iOS开发相当新,可以使用帮助,如何将单个字典= String:([(String)],[(Int)],NSDate,Bool,[(String)])保存到NSUserDefaults然后阅读它..文档不是很有用,因为它只适用于简单的词典
代码看起来非常繁琐,所以我知道我不能做得对。它应该是一个简单的解决方案,因为我只有一个变量可以保存到NSUserDefaults。
答案 0 :(得分:5)
简短回答:你不能。
NSUserDefaults
只会记录"属性列表对象" (字典,数组,字符串,数字(整数和浮点数),日期,二进制数据和布尔值)。
您无法将任何其他类型的数据保存到NSUserDefaults
或属性列表中。唯一的解决方案是将其他数据类型转换为这些类型。
元组不属于这些类型之一,因此无法将其保存到用户默认值中。
答案 1 :(得分:0)
首先,您与NSUserDefaults
的互动完全错误。您只需要与共享的NSUserDefaults.sharedUserDefaults()
实例进行交互,而不是创建单独的实例,这似乎就是您正在做的事情(即userDefaultsMessages
,userDefaultsSenders
等)。
其次,您根本不需要致电synchronize()
。您需要手动调用它的条件很少,而这不是其中之一。
第三,在NSUserDefaults
中存储特定元组的最简单方法是将其转换为数组(或NSArray)并存储结果。当然,这假设元组只包含可序列化的类型,您的示例似乎包含这些类型。遗憾的是,没有通用的解决方案,但是从元组创建数组是直截了当的,因为您可以将元组索引映射到数组索引。
最后,这样的大元组通常是沿线某处设计不良的结果。也许重构有助于解决存储问题?