我正在用Swift编写代码,并使用https://github.com/evermeer/EVReflection。但是,Xcode在使用我的类结构玩弄恶作剧-在某些地方,它声称我需要包含一个必需的初始化,并在EVObject
中声明,但在其他地方则不需要。考虑以下示例:
class Root: EVObject {
}
class MidA: Root {
required init() {
}
init(blah: String) {
}
}
class LeafA: MidA {
required init() {
super.init()
}
} // Error: 'required' initializer 'init(coder:)' must be provided by subclass of 'EVObject'
class MidB: Root {
required init() {
}
}
class LeafB: MidB {
required init() {
super.init()
}
} // No error
EVObject
包含以下方法定义:
public convenience required init?(coder: NSCoder) {
self.init()
EVReflection.decodeObjectWithCoder(self, aDecoder: coder, conversionOptions: .DefaultNSCoding)
}
用文字描述示例,有一个根对象Root
,它扩展了EVObject
,并且分叉成两个子类MidA
和MidB
,每个子类都有自己的子类:LeafA
和LeafB
。 LeafA
和LeafB
的名称和超类相同。 MidA
和MidB
的区别仅在于名称,而MidA
还有一个带有参数的初始化程序。
对LeafA
可能有什么影响?拥有一个带有参数的额外初始化程序似乎与EVObject
中声明的特定初始化程序(显然是required
,但通常不强制执行?)无关。为什么在分支类中突然添加一个不相关的初始化类,在我的叶子类中却要求我弄清楚这个从未见过的required
初始化类到底是什么呢?
答案 0 :(得分:0)
这确实是由额外的init引起的
init(blah: String) {
}
那也可以改为:
convenience init(blah: String) {
self.init()
}
那么它就不会抱怨添加所需的初始化程序。
为方便起见,您指定从此处调用所需的初始化程序。否则,编译器将无法确保您这样做。
另请参阅https://docs.swift.org/swift-book/LanguageGuide/Initialization.html