首页 > 解决方案 > EVReflection 中的 Swift 必需初始化程序

问题描述

我正在用 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了 ,它分叉成两个子类MidAMidB,每个子类都有自己的子类:LeafALeafBLeafA除了名称和LeafB超类之外,它们是相同的。 MidA并且MidB仅在名称上有所不同,并且MidA具有一个带有参数的附加初始化程序。

那可能有什么关系LeafA?有一个带有参数的额外初始化程序似乎与声明的特定初始化程序完全无关EVObject(这显然是required,但通常不强制执行??)。为什么在分支类中添加一个不相关的初始化突然需要我在我的叶子类中弄清楚required我以前从未见过的这个初始化器到底是什么?

标签: swiftinitializer

解决方案


这确实是由额外的init引起的

init(blah: String) {
}

那一个也可以更改为:

convenience init(blah: String) {
    self.init()
}

然后它不会抱怨添加所需的初始化程序。

您可以方便地指定从那里调用所需的初始化程序。没有它,编译器就不能确定你这样做了。

另请参阅https://docs.swift.org/swift-book/LanguageGuide/Initialization.html


推荐阅读