【问题标题】:Save custom class objects in NSUserDefaults in Swift在 Swift 的 NSUserDefaults 中保存自定义类对象
【发布时间】:2015-06-24 05:31:41
【问题描述】:

我试图将一些对象保存在数组中,但我的对象使用的是继承属性 但是当试图读取它说的对象时

  Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -decodeObjectForKey: cannot be sent to an abstract object of class NSCoder: Create a concrete instance!'

结构是

Service(SuperClass)
      Service1(Subclass)
      Service2
      Service3

这样我就使用了这段代码

var S1:Service1 = Service1()
        S1.apiKey = Apikey.text!
        TableViewController.agregar(S1)
        let datos = NSKeyedArchiver.archivedDataWithRootObject(TableViewController.Servicios!)
        NSUserDefaults.standardUserDefaults().setObject(datos, forKey: "ServiciosGuardados")
        NSUserDefaults.standardUserDefaults().synchronize()

这是类函数

class Servicio:NSObject, NSCoding{
var nombre:String = "null"
var tipo:Int = 0

override init() {}

required init(coder aDecoder: NSCoder = NSCoder.empty()) {
    self.nombre = aDecoder.decodeObjectForKey("nombre") as! String
    self.tipo = aDecoder.decodeObjectForKey("tipo") as! Int
}
func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeObject(nombre, forKey: "nombre")
    aCoder.encodeObject(tipo, forKey: "tipo")
}

-我的问题出在从 Servicio 继承的 Service1 中

class Service1: Servicio {
var apiKey = "null"


override init() {
    super.init(coder: NSCoder())
}

required init(coder aDecoder: NSCoder) {
    super.init(coder: NSCoder())
    if let apiKey = aDecoder.decodeObjectForKey("apiKey") as? String {
        self.apiKey = apiKey
    }
}

override func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeObject(self.apiKey, forKey: "apiKey")
}

【问题讨论】:

标签: ios swift nsuserdefaults nscoder nskeyedunarchiver


【解决方案1】:

您不能使用NSUserDefaults 来保存不属于NSDataNSStringNSNumberNSDateNSArrayNSDictionary 类型的对象。

但是感谢NSCoding,您可以在文件中序列化和保存/加载自定义对象。

由于您的类已经支持NSCoding,请使用NSKeyedArchiverNSKeyedUnarchiver 来存储和检索您的自定义对象:

// save your custom object in a file
NSKeyedArchiver.archiveRootObject(myCustomObject, toFile: "/path/to/filename")

// load your custom object from the file
if let temp = NSKeyedUnarchiver.unarchiveObjectWithFile("/path/to/filename") {
    self.myCustomObject = temp
}

在本例中,myCustomObject 可以是 Service1 实例,也可以是实例数组等。

【讨论】:

    【解决方案2】:

    这里是:

    NSUserDefaults 中的可存储类型

    NSUserDefaults 类的行为非常类似于称为属性列表(又名 plist)的东西。它可能只是一个 plist 的精美界面,或者可能更多,我不完全确定。尽管如此,plist 可以存储的对象类型是有限的。 plist 可以存储的六种类型是:

    NSData
    NSString
    NSNumber
    NSDate
    NSArray
    NSDictionary
    

    这是存储自定义对象的 obj-c 示例:How to store custom objects in NSUserDefaults

    【讨论】:

    • 谢谢,但实际上我的问题出在继承类(Service1)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多