如何用NSCoding保存结构
如何保存我的结构与NSCoding,以便它不会改变,即使用户 关闭应用程序?我将不胜感激,如果你也可以告诉我如何正确实施缺少的代码。如何用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
}
}
我怎样才能确保整个阵列在此范围内?
对于结构体,您应该使用新的Codable协议。从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)
我到底需要在变量声明中插入三行? @ Calimari328 –
@JoyLucas我不知道我理解你的问题。你能改述一下吗? – DerrickHo328
let a = .... //错误:无法使用类型'(items:[String],看到:Int)的参数列表类型'QuotesViewController.RandomItems'调用初始化程序'@ Calimari328我该如何解决这个问题? –
你需要把它变成一个类。您还需要子类化NSObject并使其符合NSCoding –
可能的重复[使用Swift将类中的结构保存到NSUserDefaults中](https://stackoverflow.com/questions/25546716/save-struct-in-class-to- nsuserdefaults-using-swift) – TNguyen