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,MidAMidB,每个都有自己的子 class:LeafALeafBLeafALeafB 除了名称和 superclass 之外是相同的。 MidAMidB 仅在名称上有所不同,因为 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