- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
作为面向协议(protocol)的编程概念,我使用Struct 创建了我的模型。
我想将“Struct
”的Array 保存到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:]: unrecognized selector sent to instance
我也试过先对每个对象进行编码,然后尝试将它们保存为默认值,然后它也会报错。
谁能指导我如何以正确的方式编码/解码 Userdefaults 中的结构数组而不将其转换为字典?
最佳答案
您可以像这样设置结构以直接使用 NSKeyedArchiver
:
struct Room {
let name : String
let id : String
let booked : Bool
}
extension Room {
func encode() -> Data {
let data = NSMutableData()
let archiver = NSKeyedArchiver(forWritingWith: data)
archiver.encode(name, forKey: "name")
archiver.encode(id, forKey: "id")
archiver.encode(booked, forKey: "booked")
archiver.finishEncoding()
return data as Data
}
init?(data: Data) {
let unarchiver = NSKeyedUnarchiver(forReadingWith: data)
defer {
unarchiver.finishDecoding()
}
guard let name = unarchiver.decodeObject(forKey: "name") as? String else { return nil }
guard let id = unarchiver.decodeObject(forKey: "id") as? String else { return nil }
booked = unarchiver.decodeBool(forKey: "booked")
self.name = name
self.id = id
}
}
要与 UserDefaults 一起使用,请这样调用:
// to encode to data and save to user defaults
let room = Room(name: "asdf", id: "123", booked: true)
UserDefaults.standard.set(room.encode(), forKey: "room")
// to retrieve from user defaults
if let data = UserDefaults.standard.object(forKey: "room") as? Data {
let room = Room(data: data)
}
可以像这样保存/检索房间数组:
func saveRooms(arrayRooms: [Room]) {
let roomsData = arrayRooms.map { $0.encode() }
UserDefaults.standard.set(roomsData, forKey: "rooms")
}
func getRooms() -> [Room]? {
guard let roomsData = UserDefaults.standard.object(forKey: "rooms") as? [Data] else { return nil }
return roomsData.flatMap { return Room(data: $0) }
}
// save 2 rooms to user defaults
let roomA = Room(name: "A", id: "123", booked: true)
let roomB = Room(name: "B", id: "asdf", booked: false)
saveRooms(arrayRooms: [roomA, roomB])
// get the rooms
print(getRooms())
关于ios - 使用 NSKeyedArchiver 和 Userdefault 保存结构数组,其中对象符合 NSCoding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40779910/
所以我正在创建一个附加对象的数组。我的问题是我想添加对象而不删除原始对象。一旦我附加了对象,我就会看到它们。但是当我添加新对象时,旧对象消失了,并被旧对象取代。如何通过 NSUserDefaults
Swift 3.0 中 UserDefaults() 和 UserDefaults.standard 有区别吗? 最佳答案 UserDefaults - 为您提供一个新对象,每个对象都分配不同的内存并
当我打印 .text 属性 print(inputField.text!) 时,它会打印 0.0925,这就是我输入的内容。但是当我将其传递给 UserDefault 或变量时, defaults.s
我创建了一个虚拟 IOS 应用程序来很好地解释我的问题。让我分享所有细节: 这个虚拟 IOS 应用程序中有 2 个页面:LoginPageViewController.swift 和 Homepage
我的对象符合新的 Swift 4 Codeable协议(protocol)。如何在 UserDefaults 中保存这些对象的数组? struct MyObject: Codeable { v
是什么导致这种情况发生?此错误的两个实例出现在我的 View Controller 的最底部,其中行以“userDefaults”开头。这是我的代码 import UIKit class Second
我正在呈现一个带有一些文本字段和按钮的 View ,用户可以在该文本字段中输入一些数据,当用户单击保存按钮时,该数据将保存在 NSUserdefaults 中并显示在另一个 View 上,但它不起作用
将复杂数据存储到 UserDefaults 时,出现异常。代码如下。 写入变量c时发生异常。 struct MyData : Codable { var v1 : Int var v2 : I
我有一个 UIProgress View ,需要 60 秒才能穿过屏幕,但是我如何使它的位置而不是设置时间“var秒= 60”,我有 UserDefault 字符串作为时间? (并未包含所有代码。)
我有应用程序+扩展,并且我制作了这样的共享存储 extension UserDefaults { static let suiteName = "group.myApp" static
我试图将自定义类数组保存到 UserDefaults,但它不起作用。我在 if let 上没有得到任何返回。我在网上到处找。我使用的是 Swift 4.2 extension UserDefaults
我的要求是用户必须导航上次访问的页面,因此 我试图将UIViewController数组保存到NSUserDefault,但应用程序每次都会崩溃 let array = self.navigation
我正在我的应用中实现备份功能。因此,我正在备份所有 UserDefaults 都保存在以下路径的 UserDefaults 源文件: .../Library/Preferences/.plist 当用
我希望将精心制作的多级自定义对象保存到 NSUserDefaults 中。我的自定义类设置如下: 讲师 @property (strong, nonatomic) NSString *instruct
我正在手动将数据输入结构。但是该结构不保存数据。我尝试使用 userdefaults 但它不起作用。如果数据位于结构 bad 中,我希望数据始终显示在标签 benCarson 上。 View Cont
我想我正在尝试制作的 iOS 应用程序的某些部分存在概念问题。基本上,在此应用程序中,您将一个项目添加到列表中,该项目将在 1 小时后过期。所以你有一个小时的时间来使用它。但是,我希望在应用程序崩溃或
因此,当用户首次打开我的应用程序时,他们将看到一个带有按钮的 View ,用于继续登录或注册。在我的登录 View 中,我有一个按钮处理程序(通过操作附加),当用户按下登录按钮时调用它。尽管我使用 U
将计数用户默认值重置为来自扩展方法之外的函数。在这种情况下,它的功能很简单。现在代码从 0 开始,除非我可以使用 func 来阻止代码上升。 extension UIViewController {
我目前遇到的一个问题是,如果我离开应用程序并返回,recordData 值不会保持保存状态。如果我在不关闭应用程序的情况下再次玩游戏,它仍会保存。 如果我关闭并重新打开应用程序,ant new sco
在 Swift 中创建了一个像这样的 Array var MyArray: [String:[String:[Int]]] = [ "xx": ["x1": [1, 2, 3], "x2":
我是一名优秀的程序员,十分优秀!