Swift:如何使用Userdefaults中的结构值保存和加载字典

时间:2019-09-23 20:18:40

标签: swift dictionary structure nsuserdefaults

我已经在StackOverflow上阅读了有关该主题的一些文章。据我了解,我不能立即在userdefaults中将每个对象保存在Swift中。 在第一步中,我尝试将字典转换为NSData对象,但目前已经失败了。 我究竟做错了什么?感谢您的帮助!

我想在提到的字典中管理应用程序首选项。带有struct值的字典对我来说是最佳解决方案。

import Foundation
import UIKit


struct Properties: Codable {
    var v1: String
    var v2: Int
    var v3: Bool
}


let userdefaults = UserDefaults.standard

var dictStruct: Dictionary<String, Properties> = [:]

dictStruct["a"] = Properties(v1: "AAA", v2: 0, v3: false)
dictStruct["b"] = Properties(v1: "BBB", v2: 1, v3: true)


let dataEncoded: Data = try NSKeyedArchiver.archivedData(withRootObject: dictStruct, requiringSecureCoding: false)

userdefaults.set(dataEncoded, forKey: "KeyData")

let dataDecoded = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(userdefaults.object(forKey: "KeyData") as! Data) as! Dictionary<String, Properties>

print(dataDecoded["a"]!.v1)
  

游乐场执行终止:引发了一个错误,但未捕获到该错误:   错误域= NSCocoaErrorDomain代码= 4866“存档期间捕获到异常:-[__ SwiftValue encodeWithCoder:]:无法识别的选择器已发送到实例0x600000fc73c0   ...

1 个答案:

答案 0 :(得分:0)

您正在混合password = raw_input("Password: ") if (8 <= len(password) <= 20) and unicode(password[-1]).isdecimal() and any(x in password for x in {'.', ','}): print("Congratulations, you're in!") else: print("Wrong! This incident will be reported!") CodableNSCoding属于NSKeyed(Un)Archiver。不要使用它。

NSCoding的正确API是Codable

PropertyListEncoder/-Decoder