[英]Swift: Does not conform to protocol 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")
}
}
这是一个错误还是我错过了一些东西?
正如您在报告导航器中的详细编译器消息中所看到的,您的方法未正确声明:
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
:
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) {
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.