观看斯坦福iOS 9课程here中的演讲幻灯片,他正在创建一个带有两个初始值设定项的新UIView
(如果UIView
是从故事板创建的,则为一个;如果它是在代码中创建的)。以下代码写在该特定幻灯片的底部:
func setup() {....} //This contains the initialization code for the newly created UIView
override init(frame: CGRect) { //Initializer if the UIView was created using code.
super.init(frame: frame)
setup()
}
required init(coder aDecoder: NSCoder) { //Initializer if UIView was created in storyboard
super.init(coder:aDecoder)
setup()
}
规则是您必须首先初始化所有属性,然后才能从超类中获取init。那么为什么在这种情况下他会在他自己初始化super.init
之前调用他的超类init setup()
?并不违反以下规则:
安全检查1指定的初始值设定项必须确保在委托一个超类初始化程序之前初始化其类引入的所有属性。
如上所述,只有在知道所有存储属性的初始状态后,才会认为对象的内存已完全初始化。为了满足此规则,指定的初始值设定程序必须确保在它放开链之前初始化它自己的所有属性。
答案 0 :(得分:0)
我没有看到本例中的所有其余代码,但规则只是在调用{{1}之前必须初始化属性(即它们占用的内存必须设置为某个初始值)而不是你不能运行额外的设置代码。
您甚至可以通过声明属性super.init()
或使用自动初始化为lazy var
的{{1}}选项来逃避您的属性。然后,您可以在致电var
后设置它们。
例如:
nil