【问题标题】:Swift Required initializers in EVReflectionEVReflection 中的 Swift 必需初始化程序
【发布时间】:2019-11-26 23:49:27
【问题描述】:

我正在用 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,每个子类都有自己的子类:@987654330 @ 和 LeafBLeafALeafB 除了名称和超类之外是相同的。 MidAMidB 仅在名称上有所不同,MidA 有一个额外的初始化器,它接受一个参数。

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

【问题讨论】:

    标签: swift initializer


    【解决方案1】:

    确实是额外的init造成的

    init(blah: String) {
    }
    

    那个也可以改成:

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

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

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

    另见https://docs.swift.org/swift-book/LanguageGuide/Initialization.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-20
      • 2015-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多