如何为符合NSCoding协议的类实现可故障初始化器?
我得到以下错误:
override init() {}:在隐式生成的super.init调用时未初始化的属性“self.videoURL”return nil:在从初始化器返回nil之前,必须初始化类实例的所有存储属性。我见过Best practice to implement a failable initializer和All stored properties of a class instance must be initialized before returning 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
}
}发布于 2015-11-23 21:03:13
update :这在SWIFT2.2更新中得到了解决,您不再需要在初始化程序失败之前分配一个零值并调用超级。
用于2.2之前的Swift版本:
不幸的是,在返回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
}
}https://stackoverflow.com/questions/33880360
复制相似问题