UserDefaults:存储小型数据存储的内容超过2M启动速度将会极慢。只能存储基础数据类型如字典数组浮点数整型字符串等。不能存高级数据类型如类结构体等。这里以存储聊天记录举例实际开发中不能用来存储这么大的。思路将Model中聊天记录转换为字典形式的数组存进UserDefaults中要加载聊天记录的时候再从UserDefaults中提取将其传入Model中。用一个方法save将消息以字典形式根据chatID的不同存进UserDefaults中。为存进UserDefaults做准备用一个方法toDic将存储信息的Model转成字典形式所以这个函数返回的是一个字典。用一个方法toChatModel加载聊天消息。要传字典进去才能转成聊天信息所以参数为字典,返回的是将字典传进去了的model。用一个方法getAllMsg从UsersDefaults中根据chatID提取存储聊天信息的字典并用方法toChatModel将其转为Model加载聊天记录。用一个方法save将消息以字典形式根据chatID的不同存进UserDefaults中。funcsave(){}为存进UserDefaults做准备用一个方法toDic将存储信息的Model转成字典形式所以这个函数返回的是一个字典。为存进UserDefaults做准备将存储信息的Model转成字典形式所以这个函数返回的是一个字典functoDic()-[String:Any]{varmuDic:[String:Any][:]//先定义一个空字典//往里面传Model让Model的值被传到字典内.发送的信息也是从Model里来的muDic[chatID]chatID muDic[messageID]messageID muDic[content]content muDic[target]target muDic[mineHead]mineHead muDic[otherHead]otherHead muDic[type]type muDic[filePath]filePath muDic[address]address muDic[latitude]latitude muDic[longitude]longitudereturnmuDic}[String: Any]是一个字典数组这是一个数组里面储存的是字典类型的元素。字典的形式就是键: (值用一个方法toChatModel加载聊天消息。要传字典进去才能转成聊天信息所以参数为字典,返回的是将字典传进去了的model。将存储的字典转换为Model,因为我们在调用的时候还没有可用的实例。所以我们用static来调用该类型方法。要传字典进去才能转所以参数为字典,返回的是将字典传进去了的model。staticfunctoChatModel(dic:[String:Any])-ChatTextModel{letchatID:Stringdic[chatID]as?String??letmessageID:Stringdic[messageID]as?String??letcontent:Stringdic[content]as?String??lettarget:Stringdic[target]as?String??letmineHead:Stringdic[mineHead]as?String??letotherHead:Stringdic[otherHead]as?String??lettype:Stringdic[type]as?String??letfilePath:Stringdic[filePath]as?String??letaddress:Stringdic[address]as?String??letlatitude:Doubledic[latitude]as?Double??0.0letlongitude:Doubledic[longitude]as?Double??0.0returnChatTextModel(chatID:chatID,messageID:messageID,content:content,target:target,mineHead:mineHead,otherHead:otherHead,type:type,filePath:filePath,address:address,latitude:latitude,longitude:longitude)}用一个方法getAllMsg从UsersDefaults中根据chatID提取存储聊天信息的字典并用方法toChatModel将其转为Model加载聊天记录。从UsersDefaults中提取已存储的字典并将其转为Model为重进的时候加载聊天记录用。将存储的字典转换为Model,因为我们在调用的时候还没有可用的实例。所以我们用static来调用该类型方法。staticfuncgetAllMsg(chatID:String)-[ChatTextModel]{//根据chatID提取到信息就转为传进ModelifvarmsgsUserDefaults.standard.object(forKey:chatID)as?[[String:Any]]{//如果有信息就对里面的每个信息都进行转换成Model的操作returnmsgs.map{dicinChatTextModel.toChatModel(dic:dic)//.map表示对msgs中的每个元素进行操作.map常用于遍历数组中的全部元素并在执行一些操作后返回它们。}}else{return[]//如果没有信息就返回空}}返回写存储函数save因为要在没实例的时候调用也加staticfuncsave(){ifvarmsgsUserDefaults.standard.object(forKey:chatID)as?[[String:Any]]{msgs.append((toDic()))UserDefaults.standard.set(msgs,forKey:self.chatID)print(成功将消息存到老字典)}else{UserDefaults.standard.set([toDic()],forKey:self.chatID)print(成功创建新字典并将消息存到UserDefaults)}}第一次发消息的时候走的是else部分因为UserDefaults里还没有存任何字典所以要根据发送的信息这是一个Model的形式把消息转成字典并存进UserDefaults里。第二次在同一个聊天窗发消息走的就是if var部分了因为已经UserDefault里已经有东西了将它转换为字典数组形式然后再添加新转换的字典元素进UserDefault中的数组中。else部分如果UserDefaults里没存消息说明没有找到与 chatID 相关的消息记录。使用UserDefaults.standard.set方法将新的字典消息放入一个数组中并用 chatID 作为键key保存到UserDefaults。if var部分检查是否已经存在存储的消息记录UserDefaults.standard.object(forKey: chatID)试图获取存储的对象并使用as? [[String: Any]]转换为字典数组即[[String: Any]]→所以msgs是一个字典数组。如果存在将新消息追加到这些记录中。.append方法把新的消息记录追加到之前取出的消息数组里。使用UserDefaults.standard.set方法将新的字典消息放入一个数组中并用 chatID 作为键key保存到 UserDefaults。set([toDic()], forKey: self.chatID)意味着创建一个新的消息数组并将它保存将加载聊天记录获得的新的Model部分传进ChatViewController中的chatModels中,同样是根据chatID传入。chatModels.append(contentsOf:ChatTextModel.getAllMsg(chatID:messCellmodel.chatID))在每次发送消息的时候调用save函数将信息以字典数组形式保存到UserDefaults中newmodel.save()发送消息的地方都要添加。这样就可以实现将消息存在UserDefaults里。