【问题标题】:How to save and retrieve class object from NSUserDefaults swift?如何从 NSUserDefaults swift 保存和检索类对象?
【发布时间】:2015-07-09 09:24:03
【问题描述】:

我正在尝试将我的数组保存到 NSUserDefaults。但是我的 Array 存在于 struct 中。

struct MyData {
    var Text = String()
    var Number = Int()
}

var Data = [MyData]()

我找到this 并尝试这样做;

let Data2 = NSKeyedArchiver.archivedDataWithRootObject(Data)

但这给了我这个:Cannot invoke 'archivedDataWithRootObject' with an argument list of type '([(TableViewController.MyData)])'

有什么建议吗?

【问题讨论】:

  • 也许您可以将您的结构转换为字符串并保存。在检索时,您可以从字符串创建一个结构。

标签: arrays swift nsuserdefaults nskeyedarchiver


【解决方案1】:

Swift structs 不是 classes,因此它们不符合 AnyObject 协议。

archivedDataWithRootObject 的语法是:

class func archivedDataWithRootObject(rootObject: AnyObject) -> NSData

这意味着它只接受AnyObject 类型的对象,而struct 不符合AnyObject 协议,所以你不能在这里使用struct

所以只需将struct 更改为class 即可。

更新:

这样你就可以把它存储到NSUserDefaults

通过 playGround 测试

import UIKit

class Person: NSObject, NSCoding {
    var name: String!
    var age: Int!
    required convenience init(coder decoder: NSCoder) {
        self.init()
        self.name = decoder.decodeObjectForKey("name") as! String
        self.age = decoder.decodeObjectForKey("age") as! Int
    }
    convenience init(name: String, age: Int) {
        self.init()
        self.name = name
        self.age = age
    }
    func encodeWithCoder(coder: NSCoder) {
        if let name = name { coder.encodeObject(name, forKey: "name") }
        if let age = age { coder.encodeObject(age, forKey: "age") }


    }

}

var newPerson = [Person]()
newPerson.append(Person(name: "Leo", age: 45))
newPerson.append(Person(name: "Dharmesh", age: 25))
let personData = NSKeyedArchiver.archivedDataWithRootObject(newPerson)
NSUserDefaults().setObject(personData, forKey: "personData")

if let loadedData = NSUserDefaults().dataForKey("personData") {
    loadedData
    if let loadedPerson = NSKeyedUnarchiver.unarchiveObjectWithData(loadedData) as? [Person] {
        loadedPerson[0].name   //"Leo"
        loadedPerson[0].age    //45
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多