Swift EVReflection 中必需的初始值设定项
Swift Required initializers in EVReflection
我正在 Swift 中编写代码,并使用 https://github.com/evermeer/EVReflection。然而,Xcode 正在用我的 class 结构玩恶作剧 - 在一些地方,它声称我需要包含一个必需的初始化,在 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
,它分叉成两个子classes,MidA
和 MidB
,每个都有自己的子 class:LeafA
和 LeafB
。 LeafA
和 LeafB
除了名称和 superclass 之外是相同的。 MidA
和 MidB
仅在名称上有所不同,因为 MidA
有一个额外的带有参数的初始值设定项。
这可能对 LeafA
有什么影响?有一个带有参数的额外初始化程序似乎与 EVObject
中声明的特定初始化程序完全无关(这显然是 required
,但通常不强制执行??)。为什么在分支 class 中添加一个不相关的初始化突然需要我,在我的叶子 classes 中,弄清楚这个我以前从未见过的 required
初始化器到底是什么?
确实是多出来的init造成的
init(blah: String) {
}
那个也可以改成:
convenience init(blah: String) {
self.init()
}
那么它就不会抱怨添加所需的初始化器了。
为了方便,您指定将从那里调用所需的初始化程序。否则编译器无法确定您是否这样做。
另见 https://docs.swift.org/swift-book/LanguageGuide/Initialization.html
我正在 Swift 中编写代码,并使用 https://github.com/evermeer/EVReflection。然而,Xcode 正在用我的 class 结构玩恶作剧 - 在一些地方,它声称我需要包含一个必需的初始化,在 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
,它分叉成两个子classes,MidA
和 MidB
,每个都有自己的子 class:LeafA
和 LeafB
。 LeafA
和 LeafB
除了名称和 superclass 之外是相同的。 MidA
和 MidB
仅在名称上有所不同,因为 MidA
有一个额外的带有参数的初始值设定项。
这可能对 LeafA
有什么影响?有一个带有参数的额外初始化程序似乎与 EVObject
中声明的特定初始化程序完全无关(这显然是 required
,但通常不强制执行??)。为什么在分支 class 中添加一个不相关的初始化突然需要我,在我的叶子 classes 中,弄清楚这个我以前从未见过的 required
初始化器到底是什么?
确实是多出来的init造成的
init(blah: String) {
}
那个也可以改成:
convenience init(blah: String) {
self.init()
}
那么它就不会抱怨添加所需的初始化器了。
为了方便,您指定将从那里调用所需的初始化程序。否则编译器无法确定您是否这样做。
另见 https://docs.swift.org/swift-book/LanguageGuide/Initialization.html