如何在Swift中为符合NSCoding协议的类实现可失败的初始值设定项?
如何为符合NSCoding协议的类实现可失败的初始值设定项 我收到以下错误:如何在Swift中为符合NSCoding协议的类实现可失败的初始值设定项?,swift,Swift,如何为符合NSCoding协议的类实现可失败的初始值设定项 我收到以下错误: 1.行重写init(){}:属性“self.videoURL”未在隐式生成的super.init调用中初始化 2.行返回nil:在从初始值设定项返回nil之前,必须初始化类实例的所有存储属性 我见过,这对我帮助很大,但由于我的类也符合NSCoding协议,我不知道如何在我的例子中实现一个失败的初始化器 关于如何实现一个失败的初始化器有什么建议吗 class CustomMedia : NSObject, NSCodin
1.行
重写init(){}
:属性“self.videoURL”未在隐式生成的super.init调用中初始化2.行
返回nil
:在从初始值设定项返回nil之前,必须初始化类实例的所有存储属性
我见过,这对我帮助很大,但由于我的类也符合NSCoding协议,我不知道如何在我的例子中实现一个失败的初始化器
关于如何实现一个失败的初始化器有什么建议吗
class CustomMedia : NSObject, NSCoding {
var videoTitle: String?
let videoURL: NSURL!
override init() {}
init?(title: String?, urlString: String) {
// super.init()
if let url = NSURL(string: urlString) {
self.videoURL = url
self.videoTitle = title
} else {
return nil
}
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(self.videoTitle, forKey: PropertyKey.videoTitle)
aCoder.encodeObject(self.videoURL, forKey: PropertyKey.videoURL)
}
required init(coder aDecoder: NSCoder) {
videoTitle = aDecoder.decodeObjectForKey(PropertyKey.videoTitle) as? String
videoURL = aDecoder.decodeObjectForKey(PropertyKey.videoURL) as! NSURL
}
}
更新:这在Swift 2.2更新中得到了解决,在初始化失败之前,您不再需要分配nil值并调用super 对于Swift 2.2之前的版本: 不幸的是,在返回
nil
之前,实际上必须初始化值
以下是可行的解决方案:
class CustomMedia : NSObject, NSCoding {
var videoTitle: String?
var videoURL: NSURL!
init?(title: String?, urlString: String) {
super.init()
if let url = NSURL(string: urlString) {
self.videoURL = url
self.videoTitle = title
} else {
self.videoURL = nil
self.videoTitle = nil
return nil
}
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(self.videoTitle, forKey: PropertyKey.videoTitle)
aCoder.encodeObject(self.videoURL, forKey: PropertyKey.videoURL)
}
required init(coder aDecoder: NSCoder) {
videoTitle = aDecoder.decodeObjectForKey(PropertyKey.videoTitle) as? String
videoURL = aDecoder.decodeObjectForKey(PropertyKey.videoURL) as! NSURL
}
}
为什么要执行
重写init(){}
?@DanVanWinkle我在其他示例中看到它是以这种方式实现的,以符合NSCoding,并且它没有导致任何错误。太好了,我已经把它注释掉了,第一个错误消失了。我该怎么做呢?我把videoURL=NSURL(字符串:https://www.google.com/")!代码>在返回nil之前,但它不起作用。Sitll得到错误:在从初始值设定项返回nil之前,必须初始化类实例的所有存储属性。我必须在返回nil之前输入上面的代码,并且必须清理项目。否则我就得到了上面的错误。无法理解,因为我没有在每次生成之前清理项目。@Andrej您可以只分配nil,因为类型是可选的,您不必创建有效的URL。不,videoURL不是可选的,所以我不能将其设置为nil。只有videoTitle是可选的,在返回nil之前不需要初始化。也许你没有注意到var-videoURL:NSURL中的“!”代码>NSURL
是可选类型,它是隐式展开的可选类型。当它为nil
时,您无法引用它而不会导致崩溃。不过,您完全可以指定nil
。