我正在尝试在
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")
}
}
这是一个bug还是我只是想念一些东西?
解决方法
在报告导航器中的详细编译器消息中可以看到,
您的方法未正确声明:
您的方法未正确声明:
error: type 'ServerInfo' does not conform to protocol 'NSCoding'
class ServerInfo: NSObject,NSCoding {
^
Foundation.NSCoding:2:32: note: protocol requires function 'encodeWithCoder' with type '(NSCoder) -> Void'
@objc(encodeWithCoder:) func encodeWithCoder(aCoder: NSCoder)
^
note: candidate has non-matching type '(NSCoder!) -> ()'
func encodeWithCoder(_aCoder: NSCoder!) {
^
Foundation.NSCoding:3:25: note: protocol requires initializer 'init(coder:)' with type '(coder: NSCoder)'
@objc(initWithCoder:) init(coder aDecoder: NSCoder)
^
note: candidate has non-matching type '(coder: NSCoder!)'
init(coder aDecoder: NSCoder!) {
(这可能在beta版本之间发生变化)
此外,initWithCoder方法必须标记为必需:
required init(coder aDecoder: NSCoder) { }
func encodeWithCoder(_aCoder: NSCoder) { }
在Swift 3中,所需的方法是
required init(coder aDecoder: NSCoder) { }
func encode(with aCoder: NSCoder) { }