【发布时间】:2016-11-24 07:04:49
【问题描述】:
作为面向协议的编程概念,我使用 Struct 创建了我的模型。
我想将 Array 的“Struct”保存到 Userdefault 中。但是我在这个模型的数组的编码/解码中遇到了问题。
这是我的模型结构
struct Room {
let name : String
let id : String
let booked : Bool
}
在这里我创建了一个像这样的扩展
extension Room {
func decode() -> Room? {
let userClassObject = NSKeyedUnarchiver.unarchiveObject(withFile: RoomClass.path()) as? RoomClass
return userClassObject?.room
}
func encode() {
let personClassObject = RoomClass(room: self)
NSKeyedArchiver.archiveRootObject(personClassObject, toFile: RoomClass.path())
}
class RoomClass: NSObject, NSCoding {
var room : Room?
init(room: Room) {
self.room = room
super.init()
}
class func path() -> String {
let documentsPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).first
let path = documentsPath?.appending(("/Room"))
return path!
}
func encode(with aCoder: NSCoder) {
aCoder.encode(room!.name, forKey: "name")
aCoder.encode(room!.id, forKey: "Id")
aCoder.encode(room!.booked, forKey: "booked")
}
required init?(coder aDecoder: NSCoder) {
let _name = aDecoder.decodeObject(forKey: "name") as? String
let _id = aDecoder.decodeObject(forKey: "Id") as? String
let _booked = aDecoder.decodeBool(forKey: "booked")
room = Room(name: _name!, id: _id!, booked: _booked)
super.init()
}
}
}
当我尝试像这样保存 arrRoomList(房间对象数组)时
self.saveRooms(arrayRooms: arrRoomList)
我收到了这个错误
[_SwiftValue encodeWithCoder:]: 无法识别的选择器发送到实例
我也尝试过先对每个对象进行编码,然后尝试将它们保存为默认值,然后它也会出错。
谁能指导我如何以正确的方式编码/解码 Userdefaults 中的 Struct 数组而不将其转换为字典?
【问题讨论】:
-
看起来很复杂,您要将结构转换为类进行编码和保存?
-
@Idan:我已经用更多细节修改了我的问题。我想将结构保存到默认值,其中对象正在确认 NSCoding
-
Dump NSCoding 之类的,把你的对象转成 Dictionary,然后保存,很简单,代码量也差不多
-
@Tj3n:这是一个好习惯吗?我不确定这就是我要问的原因。
-
你为什么觉得它不好?基本上它也是我认为的 NSCoding 所做的,但它只是在所有事情之后将它们编码为 NSData
标签: ios swift nsuserdefaults