在夫特下面,亚类时ChildView(dummy: NSObject())
被调用时,用于ParentView两个不同的指定的初始值将被调用,和myLayer
的{{1}}进行两次初始化的ivar
不,这将不会在一个游乐场发生 - 将正确报告ParentView
但是,在Xcode项目(例如命令行工具)中,它将可以编译并正常运行。
我了解很多情况,以及如何预防此问题。但是我很想了解为什么编译器不会出错,或者至少警告我有关此代码(并防止出现双重初始化)
这段代码可以在Swift 4.2下干净地编译,并且在调试器中,我可以确切地看到正在发生的事情:
调用error: MyPlayground.playground:5:31: error: must call a designated initializer of the superclass 'NSView'
时,它将调用ChildView(dummy:)
这是一个指定的初始化程序,ParentView ivars是否也被初始化(ParentView(dummy:)
)
然后myLayer
{呼叫{1}},它是ParentView(dummy:)
NSView.init()的实现调用super.init()
,所以NSView.init()
被调用,并调用initWithFrame
。这也是指定的初始化程序,所以
ChildView.init(frame:)
第二次初始化。
要演示这一点,请参见以下类,调用
ParentView.init(frame:)
myLayer
将得到印刷两次。
避免这种情况的方法是调用let _ = ChildView(dummy: NSObject)
呼叫>>>> creating layer
,然后问题就消失了。
我的问题确实是,这怎么会首先发生?
ParentView(dummy:)
此应该会生成一个编译时错误,就像在Playground中一样。
我似乎无法构造出具有相同行为的类似非NSView类层次结构。无论我如何调整的层次结构,构造函数等,斯威夫特,当我尝试这个新的对象(甚至当我混Objective-C和斯威夫特,是analagous到的NSView总是给人编译器错误。
尽管我可以看到它在调试器中执行,但是我也找不到NSView.init()的任何公共声明。