如何从 NSUserDefaults swift 保存和检索 class 对象?
How to save and retrieve class object from NSUserDefaults swift?
我正在尝试将我的数组保存到 NSUserDefaults。但是我的数组存在于 struct.
struct MyData {
var Text = String()
var Number = Int()
}
var Data = [MyData]()
我找到了 并尝试这样做;
let Data2 = NSKeyedArchiver.archivedDataWithRootObject(Data)
但这给了我这个:Cannot invoke 'archivedDataWithRootObject' with an argument list of type '([(TableViewController.MyData)])'
有什么建议吗?
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
}
}
我正在尝试将我的数组保存到 NSUserDefaults。但是我的数组存在于 struct.
struct MyData {
var Text = String()
var Number = Int()
}
var Data = [MyData]()
我找到了
let Data2 = NSKeyedArchiver.archivedDataWithRootObject(Data)
但这给了我这个:Cannot invoke 'archivedDataWithRootObject' with an argument list of type '([(TableViewController.MyData)])'
有什么建议吗?
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
}
}