我读了 初始化编码器解码器到底是什么?
但这并不能回答为什么不把所有东西都放在awakeFromNib
里而忘记使用init(coder aCoder : NSCoder)
?
在接受的答案的评论中,胖子说:
"有时你不能那样做"。您通常可以但并非总是如此
谁能提供更多的解释?
如果您有需要在init
中初始化的lets
,则必须使用它而不是awakeFromNib
。
这样做可以避免隐式解包的可选项。
编辑:
如果希望类具有属性,可以执行
let a: String
或
var a: String! = nil // this is called an "implicitly unwrapped optional" -- it's the ! at the end of the type that makes it that.
第一个是可取的,因为它是安全的。在第二种情况下,您冒着在初始化之前访问a
的风险。
但是,为了确保始终初始化a
,它需要在类的init
中获取其值。
所以
init(coder aCoder : NSCoder) {
a = "hello" // usually this is something more complex
// read in coder or whatever else you need to do
}
如果您没有 init,那么您就不能有一个稍后初始化的 init。