1
我有一个状态属性的用户类,我想将其存储到NSUserDefault这就需要先进行编码的用户类别。
User类代码更新版本
public class User: NSObject, NSCoding {
override init() {}
var status: Status = .unKnow
required convenience public init(coder aDecoder: NSCoder) {
self.init()
self.status = aDecoder.decodeObject(forKey: "UserStatus") as? Status ?? .unKnow
}
public func encode(with aCoder: NSCoder) {
aCoder.encode(self.status, forKey: "UserStatus")
}
public func updatePersistentData() {
let userDefault = UserDefaults.standard
/// stuck at this line
let encodedData: Data = NSKeyedArchiver.archivedData(withRootObject: self)
userDefault.set(encodedData, forKey: "User")
userDefault.synchronize()
}
}
我的嵌套枚举
enum Status {
/// is Login status
case isLogin(style: LoginStatus)
/// is register
case isRegister(style: RegisterStatus)
/// is fetch user info
case isGetUserInfo(style: GetUserInfoStatus)
/// nonabove
case unKnow
}
enum LoginStatus: Int {
case a
case b
case c
case d
}
enum RegisterStatus: Int {
case a
case b
case c
case d
}
enum GetUserInfoStatus: Int {
case a
case b
case c
case d
}
我发现this,并理解我需要枚举转换为原始值。它似乎需要使用字符串样式或Int样式等的正常枚举。
我运行代码,错误消息
HJC[2371:403228] -[_SwiftValue encodeWithCoder:]: unrecognized selector sent to instance 0x7f940e6bec30
HJC[2371:403228] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_SwiftValue encodeWithCoder:]: unrecognized selector sent to instance 0x7f940e6bec30'
感谢您的答复,但我仍然有错误'终止应用程序由于未捕获的异常'NSInvalidArgumentException',原因:' - [_ SwiftValue encodeWithCoder:]:无法识别的选择器发送到实例0x7f940e6bec30''在这个方法** let encodedData:Data = NSKeyedArch iver.archivedData(withRootObject:self)**这是写在用户类内 –
@StephenChen我从你的错误中注意到你仍然在使用'func encodeWithCoder(aCoder:NSCoder)'而不是'public func encode(with aCoder:NSCoder) '。是这种情况还是这是你以前没有得到的新错误? – Prientus
@Prientus对不起,我打错了。感谢您的通知,在我的代码中,我确实使用了'公共func编码(使用代码:NSCoder)' –