swift - 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
了 ,它分叉成两个子类MidA
和MidB
,每个子类都有自己的子类:LeafA
和LeafB
。 LeafA
除了名称和LeafB
超类之外,它们是相同的。 MidA
并且MidB
仅在名称上有所不同,并且MidA
具有一个带有参数的附加初始化程序。
那可能有什么关系LeafA
?有一个带有参数的额外初始化程序似乎与声明的特定初始化程序完全无关EVObject
(这显然是required
,但通常不强制执行??)。为什么在分支类中添加一个不相关的初始化突然需要我在我的叶子类中弄清楚required
我以前从未见过的这个初始化器到底是什么?
解决方案
这确实是由额外的init引起的
init(blah: String) {
}
那一个也可以更改为:
convenience init(blah: String) {
self.init()
}
然后它不会抱怨添加所需的初始化程序。
您可以方便地指定从那里调用所需的初始化程序。没有它,编译器就不能确定你这样做了。
另请参阅https://docs.swift.org/swift-book/LanguageGuide/Initialization.html
推荐阅读
- flutter - 即使应用程序关闭也显示通知
- pine-script - 这“不是函数”(Pine-Script)
- kubernetes - 如何使用 Ingress 访问 Kubernetes 中的多个服务?
- java - 如何通过将值作为参数传递来从 Java 中的链表中删除值
- php - UTF8 编码的消息在 php smpp 短信发送中损坏字符
- php - PHP 检查是否有方法链接或返回结果
- spacy - spacy 段落级别的实体链接
- sql-server - 如何将 datetimeoffset 表列返回到自定义集中?
- css - 如何在 Bootstrap v5 中使用 @use 而不是 @import 进行自定义
- java - 使用 RxJava Flowable - 如何根据事件的类型拆分发射