我看了What exactly is init coder aDecoder?
但是,为什么不将所有内容都放在awakeFromNib
内并忘记使用init(coder aCoder : NSCoder)
?
在接受回答的评论中,Fattie说:
“有时你不能这样做”。您通常可以但不总是
有人可以提供更多解释吗?
答案 0 :(得分:1)
如果lets
需要在init
中进行初始化,则必须使用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
}
中获取其值。
所以,
MyTrait
如果你没有init,那么你就不能拥有一个稍后初始化的init。