我已经在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 ...
答案 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!")
和Codable
。 NSCoding
属于NSKeyed(Un)Archiver
。不要使用它。
NSCoding
的正确API是Codable
PropertyListEncoder/-Decoder