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) { ... }