sunshinejr / SwiftyUserDefaults

Modern Swift API for NSUserDefaults
http://radex.io/swift/nsuserdefaults/static
MIT License
4.85k stars 366 forks source link

The save object appears an exception. #156

Closed ETmanwenhan closed 5 years ago

ETmanwenhan commented 6 years ago
class Loginer: Codable, HandyJSON {

    var isLogin: Bool? = false
    let single: String?         //单点登录标识
    var phone: String?
    var psw: String?

    required init() {

        Loger.log(msg: "Loginer初始化")
        guard let single = Defaults[.single], single.isEmpty == false else {

            let single = RegexTool.randomCode(20) //防刷码
            self.single = single
            Defaults[.single] = single
            Loger.log(msg: "生产防刷码:\(single)")
            return
        }

        self.single = single
    }

    //自定义CodingKey
    private enum CodingKeys: String, CodingKey {
        case isLogin
        case single
        case phone
        case psw
    }

    //解码
    required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)

        self.isLogin = try container.decode(Bool?.self, forKey: .isLogin)
        self.single = try container.decode(String?.self, forKey: .single)
        self.phone = try container.decode(String?.self, forKey: .phone)
        self.psw = try container.decode(String?.self, forKey: .psw)
    }

    //编码
    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)

        try container.encode(self.isLogin, forKey: .isLogin)
        try container.encode(self.single, forKey: .single)
        try container.encode(self.phone, forKey: .phone)
        try container.encode(self.psw, forKey: .psw)
    }
}
 let model = Loginer()
  Defaults[.loginInfo] = model

The save object has the following exception.

2018-05-24 12:07:17.849582+0800 yiyue[8892:520360] *** NSForwarding: warning: object 0x6040000fbc80 of class 'yiyue.Loginer' does not implement methodSignatureForSelector: -- trouble ahead
Unrecognized selector -[yiyue.Loginer replacementObjectForKeyedArchiver:]
2018-05-24 12:07:17.849920+0800 yiyue[8892:520360] Unrecognized selector -[yiyue.Loginer replacementObjectForKeyedArchiver:]
sunshinejr commented 6 years ago

Hey @ETmanwenhan. To use Codable with SwiftyUserDefaults you need to implement DefaultsSerializable as well, so the fix would be to add it to the implementation list:

class Loginer: Codable, HandyJSON, DefaultsSerializable {

I wonder how you were able to create a key without implementing DefaultsSerializable though 🤔 Can you copy the line where you create your .loginInfo key? + Can you also tell me something about this HandyJSON type?

sunshinejr commented 5 years ago

Closing due to inactivity.