gpt4 book ai didi

swift - 如何在 Swift 中为符合 NSCoding 协议(protocol)的类实现一个可失败的初始化器?

转载 作者:行者123 更新时间:2023-11-30 13:54:07 25 4
gpt4 key购买 nike

如何为符合 NSCoding 协议(protocol)的类实现可失败的初始化程序?

我收到以下错误:
1.行覆盖 init() {}:属性“self.videoURL”未在隐式生成的 super.init 调用中初始化
2.行return nil:在从初始化器返回nil之前,必须初始化类实例的所有存储属性

我见过Best practice to implement a failable initializerAll stored properties of a class instance must be initialized before returning nil这对我帮助很大,但由于我的类也符合 NSCoding 协议(protocol),我不知道如何在我的情况下实现可失败的初始化程序。

关于如何实现可失败的初始化程序有什么建议吗?

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。

对于 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
}
}

关于swift - 如何在 Swift 中为符合 NSCoding 协议(protocol)的类实现一个可失败的初始化器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33880360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com