gpt4 book ai didi

ios - 调用协议(protocol)扩展初始化器

转载 作者:搜寻专家 更新时间:2023-11-01 06:00:45 24 4
gpt4 key购买 nike

我正在尝试构建一组共享通用初始化代码的类。除了继承,我认为协议(protocol)是可行的方法。虽然协议(protocol)和协议(protocol)扩展适用于实例和静态方法,但我在使用初始化器时遇到了一些麻烦。

假设我们有这个协议(protocol):

protocol CloudServiceWrapper {

static var isConfigured: Bool { get }

init()

func initialize()

}

现在假设我们要在协议(protocol)扩展中为 isConfiguredinit() 添加默认实现:

extension CloudServiceWrapper {

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

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

}

}

最后,让我们创建一个实现此协议(protocol)并尝试从其默认实现中获益的类:

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")
}

}

当尝试构建 OneDriveWrapper 类的新实例时,我根本无法找到既调用类的初始化程序又调用默认协议(protocol)实现的方法。并且不可能在 OneDriveWrapper 类中省略 init(),因为根据协议(protocol)定义它是必需的,并且似乎不被认为是通过协议(protocol)扩展“实现”的.

事实上,更广泛地说,我找不到任何方法来显式调用协议(protocol)扩展的初始化程序,即使我知道实例方法是可能的。

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

谢谢!

最佳答案

protocol 中的 init必需的,因此必须显式实现,即不能使用默认实现。

至于“显式调用协议(protocol)扩展的初始化程序”,您不能实例化协议(protocol)类型。

我建议为此使用继承。

关于ios - 调用协议(protocol)扩展初始化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51830640/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com