Swift:不符合协议NSCoding

我试图在我用swift编写的类上使用NSCoding协议,但似乎无法弄清楚为什么编译器会在执行所需的方法时抱怨它“不符合协议NSCoding”:

class ServerInfo: NSObject, NSCoding { var username = "" var password = "" var domain = "" var location = "" var serverFQDN = "" var serverID = "" override init() { } init(coder aDecoder: NSCoder!) { self.username = aDecoder.decodeObjectForKey("username") as NSString self.password = aDecoder.decodeObjectForKey("password") as NSString self.domain = aDecoder.decodeObjectForKey("domain") as NSString self.location = aDecoder.decodeObjectForKey("location") as NSString self.serverFQDN = aDecoder.decodeObjectForKey("serverFQDN") as NSString self.serverID = aDecoder.decodeObjectForKey("serverID") as NSString } func encodeWithCoder(_aCoder: NSCoder!) { _aCoder.encodeObject(self.username, forKey: "username") _aCoder.encodeObject(self.password, forKey: "password") _aCoder.encodeObject(self.domain, forKey: "domain") _aCoder.encodeObject(self.location, forKey: "location") _aCoder.encodeObject(self.serverFQDN, forKey: "serverFQDN") _aCoder.encodeObject(self.serverID, forKey: "serverID") } } 

这是一个错误还是我错过了什么?

正如您在报告导航器中的详细编译器消息中所看到的,您的方法没有被正确声明:

错误:键入'ServerInfo'不符合协议'NSCoding'
类ServerInfo:NSObject,NSCoding {
 ^
 Foundation.NSCoding:2:32:note:protocol requires'encodeWithCoder'with type'(NSCoder) - > Void'
   @objc(encodeWithCoder :) func encodeWithCoder(aCoder:NSCoder)
                                ^
注意:候选人有不匹配的types(NSCoder!) - >()'
     func encodeWithCoder(_aCoder:NSCoder!){
          ^
 Foundation.NSCoding:3:25:note:协议需要初始化'init(coder :)'与types'(coder:NSCoder)'
   @objc(initWithCoder :) init(编码器aDecoder:NSCoder)
                         ^
注:候选人有不匹配的types(编码器:NSCoder!)'
     init(coder aDecoder:NSCoder!){

(这可能在testing版本之间发生了变化。)此外, initWithCoder方法必须标记为required

 required init(coder aDecoder: NSCoder) { } func encodeWithCoder(_aCoder: NSCoder) { } 

Swift 3中 ,所需的方法是

 required init(coder aDecoder: NSCoder) { } func encode(with aCoder: NSCoder) { } 

这些参数并不隐式地展开(删除!),并且初始化程序需要required修饰符:

 required init(coder aDecoder: NSCoder) { ... func encodeWithCoder(_aCoder: NSCoder) { 

对于Swift 3

一个小的但重要的变化已经承诺。 init方法相同,但是encodeWithCoder方法已被修改。

  required init(coder aDecoder: NSCoder) { ... } func encode(with _aCoder: NSCoder) { ... } 

对于Swift 3(在Xcode 8.2 beta(8C23)上)

它似乎又改变了。 这是我可以开始工作的唯一变化…

 func encodeWithCoder(_ _aCoder: NSCoder) { ... }