PurposeEncode verschachtelt Aufzählung swift 3
Ich habe eine User-Klasse mit einem Status Eigentum und ich möchte speichere es in NSUserDefault, die die User-Klasse zuerst codieren müssen.
Benutzerklassencode aktualisierte Version
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()
}
}
Und meine verschachtelte Aufzählung
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
}
Ich fand this und verstehe ich Enum in Rohwert konvertieren müssen. Es scheint notwendig, eine normale Enum mit String-Stil oder Int-Style zu verwenden.
Und ich führen Sie den Code, Fehlermeldung
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'
Vielen Dank für die Antwort, aber Ich habe immer noch den Fehler 'Beenden der App aufgrund der nicht abgefangenen Ausnahme 'NSInvalidArgumentException', Grund: '- [_ SwiftValue encodeWithCoder:]: unerkannter Selektor an Instanz 0x7f940e6bec30 gesendet'' in dieser Methode ** lese codedData: Data = NSKeyedArch iver.archivedData (withRootObject: self) ** was in der User-Klasse geschrieben wird –
@StephenChen Ich bemerkte von Ihrem Fehler, dass Sie 'func encodeWithCoder (aCoder: NSCoder)' anstelle von 'public func encode (mit aCoder: NSCoder) verwenden '. Ist das der Fall oder ist das ein neuer Fehler, den Sie vorher nicht bekommen haben? – Prientus
@Prientus Entschuldigung, ich hatte falsch tippen. Vielen Dank für die Nachricht, in meinem Code habe ich 'Public Func encode (mit aCoder: NSCoder)' –