作爲面向協議的編程概念,我創建了我的模型Struct。保存具有NSKeyedArchiver和Userdefault的結構數組,其中對象符合NSCoding
我想將「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數組以正確的方式,而無需將其轉換爲字典?
看起來很複雜,你在你的結構轉換爲類編碼並保存? – Tj3n
@Idan:我有更多的細節修改我的問題。我想保存結構爲默認對象確認NSCoding – Wolverine
轉儲NSCoding和東西,只需將您的對象轉換爲字典,然後保存它,非常容易,代碼量也類似 – Tj3n