Swift 如何使用NSCoding保存结构

Swift 如何使用NSCoding保存结构,swift,xcode,struct,save,nscoding,Swift,Xcode,Struct,Save,Nscoding,如何使用NSCoding保存结构,以便即使用户 关闭应用程序?如果您能告诉我如何正确地实现丢失的代码,我将不胜感激 使用以下两个新功能进行更新: 这是我的密码: struct RandomItems: Codable { var items : [String] var seen = 0 init(items:[String], seen: Int) { self.items = items self.seen = se

如何使用NSCoding保存结构,以便即使用户 关闭应用程序?如果您能告诉我如何正确地实现丢失的代码,我将不胜感激

使用以下两个新功能进行更新: 这是我的密码:

    struct RandomItems: Codable
{
    var items : [String]
    var seen  = 0

    init(items:[String], seen: Int)
    {
        self.items = items
        self.seen = seen
    }

    init(_ items:[String])
    { self.init(items: items, seen: 0) }


    mutating func next() -> String
    {
        let index = Int(arc4random_uniform(UInt32(items.count - seen)))
        let item  = items.remove(at:index)
        items.append(item)
        seen = (seen + 1) % items.count
        return item
    }
    func toPropertyList() -> [String: Any] {
        return [
            "items": items,
            "seen": seen
        ]
    }


    }





override func viewWillDisappear(_ animated: Bool) {
    UserDefaults.standard.set(try? PropertyListEncoder().encode(quotes), forKey:"quote2")
}

override func viewDidAppear(_ animated: Bool) {
     if let data = UserDefaults.standard.value(forKey:"quote2") as? Data {
        let quote3 = try? PropertyListDecoder().decode(Array<RandomItems>.self, from: data)
    }

}




  }


extension QuotesViewController.RandomItems {
init?(propertyList: [String: Any]) {
    return nil
}

}
struct random项:可编码
{
变量项:[字符串]
var=0
初始化(项:[字符串],见:Int)
{
self.items=项目
self.看见的
}
初始化(u项:[字符串])
{self.init(items:items,seen:0)}
变异func next()->字符串
{
让index=Int(arc4random_uniform(UInt32(items.count-seen)))
let item=items.remove(at:index)
items.append(项目)
已看到=(已看到+1)%items.count
退货项目
}
func toPropertyList()->[字符串:任意]{
返回[
“项目”:项目,
“看见”:看见
]
}
}
覆盖函数视图将消失(u动画:Bool){
UserDefaults.standard.set(try?PropertyListEncoder().encode(引号),forKey:“quote2”)
}
覆盖函数视图显示(u动画:Bool){
如果let data=UserDefaults.standard.value(forKey:“quote2”)作为数据{
让quote3=try?PropertyListDecoder().decode(Array.self,from:data)
}
}
}
扩展名QuotesViewController.RandomItems{
初始化?(propertyList:[字符串:任意]){
归零
}
}

如何确保此处涵盖整个阵列?

对于结构,您应该使用新协议。从swift 4开始提供,强烈推荐

struct RandomItems: Codable
{
    var items: [String]
    var seen = 0
}

extension RandomItems {
     init?(propertyList: [String: Any]) {
           ...
     }
}

// Example usage
let a = RandomItems(items: ["hello"], seen: 2)
let data: Data = try! JSONEncoder().encode(a)
UserDefaults.standard.set(data, forKey: "MyKey") // Save data to disk
// some time passes
let data2: Data = UserDefaults.standard.data(forKey: "MyKey")! // fetch data from disk
let b = try! JSONDecoder().decode(RandomItems.self, from: data2)

更新

看起来原始海报将结构嵌套在另一个类中。下面是嵌套结构的另一个示例

class QuotesViewController: UIViewController {

    struct RandomItems: Codable
    {
        var items: [String]
        var seen = 0
    }
}

extension QuotesViewController.RandomItems {
    init(_ items:[String])
        { self.items = items }

    init?(propertyList: [String: Any]) {
        guard let items = propertyList["items"] as? [String] else { return nil }
        guard let seen = propertyList["seen"] as? Int else { return nil }
        self.items = items
        self.seen = seen
    }
}

// example usage
let a = QuotesViewController.RandomItems(items: ["hello"], seen: 2)
let data: Data = try! JSONEncoder().encode(a)
UserDefaults.standard.set(data, forKey: "MyKey") // Save data to disk
// some time passes
let data2: Data = UserDefaults.standard.data(forKey: "MyKey")! // fetch data from disk
let b = try! JSONDecoder().decode(QuotesViewController.RandomItems.self, from: data2)

你需要让它成为一门课。您还需要将NSObject子类化,并使其符合NSCODING可能的重复,即我必须在哪里插入带有变量声明的三行@Calimari328@JoyLucas我不确定我是否理解你的问题。你能换个说法吗?让a=//错误:无法使用类型为“(items:[String],seen:Int)”@Calimari328的参数列表调用类型为“QuotesViewController.RandomItems”的初始值设定项。如何解决此问题?可能您的结构需要正确的访问修饰符,或者您需要实现公共初始值设定项。或者,您可能正在向结构中添加不可编码的类型。信息如此之少,又不知道你是如何使用它的,很难说出来。你的结构是什么样子的?