【发布时间】:2015-11-19 09:51:01
【问题描述】:
我正在使用 Xcode 7.2 测试版。 我正在尝试制作一个符合 NSCoding 的类模型。
class Person: NSObject, NSCoding {
Xcode 希望我为此提供实现:
required init?(coder aDecoder: NSCoder)
我看到我可以删除“?”,没有人抱怨。我还在 swift 编程语言文档中找到了这个:
“您通常定义一个可失败的初始化程序,它通过在 init 关键字 (init?) 之后放置一个问号来创建适当类型的可选实例。或者,您可以定义一个可失败的初始化程序,该初始化程序创建一个隐式展开的可选实例适当的类型。通过在 init 关键字 (init!) 之后放置一个感叹号而不是问号来做到这一点。
你可以从 init 委托?初始化!反之亦然,你可以覆盖init?用初始化!反之亦然。你也可以从 init 委托给 init!,尽管这样做会触发一个断言,如果 init!初始化程序导致初始化失败。”
我的代码可以使用或不使用“?” - 我相信因为这个失败的初始化程序,所以用途广泛。谁能给我解释一下?
我已经为我的初始化器提供了这个:
required init?(coder aDecoder: NSCoder) {
super.init()
name = aDecoder.decodeObjectForKey(Keys.Name) as! String
id = aDecoder.decodeObjectForKey(Keys.ID) as! Int
imagePath = aDecoder.decodeObjectForKey(Keys.ProfilePath) as! String
movies = aDecoder.decodeObjectForKey(Keys.Movies) as! [Movie]
}
如果实现 init 没有失败应该有什么不同吗?
required init(coder aDecoder: NSCoder)
我已经完成了 encodeWithCoder impl,因此不需要在初始化程序中进行 nil 检查:
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(title, forKey: Keys.Title)
aCoder.encodeObject(id, forKey: TheMovieDB.Keys.ID)
aCoder.encodeObject(posterPath, forKey: Keys.PosterPath)
aCoder.encodeObject(releaseDate, forKey: Keys.ReleaseDate)
}
你会推荐哪一个来使用 NSKeyedArchiver/NSKeyedUnarchiver?
【问题讨论】: