调用协议扩展初始化程序

Rom*_*ain 3 ios swift swift-protocols protocol-extension

我正在尝试构建一组共享通用初始化代码的类。除了继承之外,我认为协议是可行的方法。虽然协议和协议扩展对我来说可以使用实例和静态方法,但我在使其与初始值设定项一起使用时遇到了一些麻烦。

假设我们有这个协议:

protocol CloudServiceWrapper {

    static var isConfigured: Bool { get }

    init()

    func initialize()

}
Run Code Online (Sandbox Code Playgroud)

现在假设我们要在协议扩展中添加isConfigured和的默认实现:init()

extension CloudServiceWrapper {

    static var isConfigured: Bool {
        get {
            return true
        }
    }

    init() {
        print("Initializing generic CloudServiceWrapper")
        self.init()
        if Self.isConfigured {
            initialize()
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

最后,让我们有一个类实现此协议并尝试从其默认实现中受益:

class OneDriveWrapper: CloudServiceWrapper {

    required init() {
        // CloudServiceWrapper() // error: protocol type 'CloudServiceWrapper' cannot be instantiated
        // self = CloudServiceWrapper.init() // error: cannot assign to value: 'self' is immutable
        // super.init() // error: 'super' members cannot be referenced in a root class
        // (self as CloudServiceWrapper).init() // error: static member 'init' cannot be used on instance of type 'CloudServiceWrapper'
        print("Initializing OneDriveWrapper")
    }

    func initialize() {
        print("Done")
    }

}
Run Code Online (Sandbox Code Playgroud)

当尝试构建该类的新实例时OneDriveWrapper,我根本找不到调用该类的初始值设定项和默认协议实现的方法。并且不可能init()OneDriveWrapper类中省略 ,因为它是协议定义所必需的,并且似乎不被认为是通过协议扩展“实现”的。

事实上,更广泛地说,我找不到任何方法来显式调用协议扩展的初始值设定项,即使我知道实例方法是可能的。

我究竟做错了什么?您知道有什么方法可以将类的初始化程序和协议扩展的初始化程序结合起来吗?我应该退回到类继承而不是协议和扩展吗?

谢谢!

小智 5

inita 中的anprotocolrequired,因此必须显式实现,即不能使用默认实现。

至于“显式调用协议扩展的初始值设定项”,您无法实例化协议类型。

我建议为此使用继承。