簡體   English   中英

在Swift中的NSUserDefaults中保存自定義類對象

[英]Save custom class objects in NSUserDefaults in Swift

我試圖將一些對象保存在數組中,但是我的對象使用了繼承的屬性,但是當嘗試讀取對象時,它說

  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")
}

您不能使用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實例或實例數組等。

這是 :

NSUserDefaults存儲類型

NSUserDefaults類的行為非常類似於稱為“屬性列表”(aka plist)的行為。 它可能只是plist的一個精美界面,或者可能更多,我不確定。 但是,塑料存放者只能存儲哪種物品受到限制。 可以存儲的六種類型是:

NSData
NSString
NSNumber
NSDate
NSArray
NSDictionary

這是存儲自定義對象的obj-c示例: 如何在NSUserDefaults中存儲自定義對象

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM