Swift 3中的NSCoding-由于未捕获异常而终止应用程序';NSInvalidArgumentException';,原因:'-[AppName.User EncoderWithCoder:]

Swift 3中的NSCoding-由于未捕获异常而终止应用程序';NSInvalidArgumentException';,原因:'-[AppName.User EncoderWithCoder:],swift,swift3,nscoding,nskeyedarchiver,Swift,Swift3,Nscoding,Nskeyedarchiver,我在实现NSCoding时遇到了一些问题。以下是我的用户类代码: public class User: NSCoder { ... n编码方法: 解码器: required public init(coder aDecoder: NSCoder) { self.deviceToken = aDecoder.decodeObject(forKey: kUserDeviceTokenKey) as? String self.postalCode = aDecoder.decodeO

我在实现NSCoding时遇到了一些问题。以下是我的用户类代码:

public class User: NSCoder {
...
n编码方法:

解码器:

required public init(coder aDecoder: NSCoder) {
    self.deviceToken = aDecoder.decodeObject(forKey: kUserDeviceTokenKey) as? String
    self.postalCode = aDecoder.decodeObject(forKey:kUserPostalCodeKey) as? String
    self.latitude = aDecoder.decodeObject(forKey:kUserLatitudeKey) as? Float
    self.views = aDecoder.decodeObject(forKey:kUserViewsKey) as? Int
...
编码器:

func encode(with aCoder: NSCoder) {
    aCoder.encode(deviceToken, forKey: kUserDeviceTokenKey)
    aCoder.encode(postalCode, forKey: kUserPostalCodeKey)
    aCoder.encode(latitude, forKey: kUserLatitudeKey)
    aCoder.encode(views, forKey: kUserViewsKey)
...
保存和加载方法:

public func save(user : User){
    let encodedUser = NSKeyedArchiver.archivedData(withRootObject: user)
    UserDefaults.standard.set(encodedUser, forKey: kUserLogedKey)
}

public func getUserLoged()  -> User?{
    if let userData = UserDefaults.standard.object(forKey: kUserLogedKey),
        let user = NSKeyedUnarchiver.unarchiveObject(with: userData as! Data) as? User{
        print("DICT USER LOGED: \(user.dictionaryRepresentation())")
        return user
    }else {
        return nil
    }
}
我收到了以下错误:

-[App.User encodeWithCoder:]: unrecognized selector sent to instance 0x101946e00
2017-03-05 14:22:47.540798 App[2642:750699] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[.User encodeWithCoder:]: unrecognized selector sent to instance 0x101946e00'

感谢@vadian提供解决方案:

我替换了:
公共类用户:NSCoder

作者:
公共类用户:NSObject,NSCoding

打字:
公共类用户:NSCoder
vs.
公共类用户:NSCoding
谢谢!我想念你<代码>公共类用户:NSObject,NSCoding{
这是否意味着现在必须将NSObject添加到每个类中?