arrays - 如何从 NSUserDefaults swift 中保存和检索类对象?

标签 arrays swift nsuserdefaults nskeyedarchiver

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

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

var Data = [MyData]()

我找到了 this我试着这样做;

let Data2 = NSKeyedArchiver.archivedDataWithRootObject(Data)

但这给了我这个:无法使用类型为“([(TableViewController.MyData)])”的参数列表调用“archivedDataWithRootObject”

有什么建议吗?

最佳答案

Swift structs 不是,因此它们不符合AnyObject 协议(protocol)。

archivedDataWithRootObject 的语法是:

class func archivedDataWithRootObject(rootObject: AnyObject) -> NSData

这意味着它只接受 AnyObject 类型的对象,而 struct 不符合 AnyObject 协议(protocol),所以你不能使用 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
    }
}

关于arrays - 如何从 NSUserDefaults swift 中保存和检索类对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31313324/

相关文章:

mysql - 选择 JSON 键值数组中键所在的所有行

arrays - 合并和返回数组

java - jmock - 模拟以 long[] 作为输入和 with(any()) 的方法

ios-simulator - iOS8 中存储的用户默认 plist 文件在哪里?

swift - 将 NSURL 数组保存到 NSUserDefaults

c# - 将数组的一部分复制到列表的快速方法?

iOS - 尝试读取 bundle.man.url 时不返回任何内容

ios - iOS11快速连续滑动删除UITableView单元格崩溃

ios - 在 Objective-C 中更改屏幕方向时,如何修复日期选择器 UIView 的奇怪行为?

ios - 设置初始 NSUserDefaults