EVReflection中的Swift必需的初始化程序

时间:2019-07-18 05:41:56

标签: swift initializer

我正在用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,每个子类都有自己的子类:LeafALeafBLeafALeafB的名称和超类相同。 MidAMidB的区别仅在于名称,而MidA还有一个带有参数的初始化程序。

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

1 个答案:

答案 0 :(得分:0)

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

init(blah: String) {
}

那也可以改为:

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

那么它就不会抱怨添加所需的初始化程序。

为方便起见,您指定从此处调用所需的初始化程序。否则,编译器将无法确保您这样做。

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