【发布时间】:2018-08-13 21:13:11
【问题描述】:
我正在尝试构建一组共享通用初始化代码的类。除了继承,我认为协议将是要走的路。虽然协议和协议扩展对我来说适用于实例和静态方法,但我在使用初始化器时遇到了一些麻烦。
假设我们有这个协议:
protocol CloudServiceWrapper {
static var isConfigured: Bool { get }
init()
func initialize()
}
现在假设我们要在协议扩展中为 isConfigured 和 init() 添加默认实现:
extension CloudServiceWrapper {
static var isConfigured: Bool {
get {
return true
}
}
init() {
print("Initializing generic CloudServiceWrapper")
self.init()
if Self.isConfigured {
initialize()
}
}
}
最后,让我们有一个类实现这个协议并尝试从它的默认实现中受益:
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 类的新实例时,我根本找不到既调用类的初始化程序又调用默认协议实现的方法。并且不可能在 OneDriveWrapper 类中省略 init(),因为它是协议定义所必需的,并且似乎不被认为是通过协议扩展“实现”的。
事实上,更广泛地说,我找不到任何方法来显式调用协议扩展的初始化程序,尽管我知道实例方法是可能的。
我做错了什么?您知道将类的初始化程序和协议扩展的初始化程序结合起来的任何方法吗?我应该回到类继承而不是协议和扩展吗?
谢谢!
【问题讨论】:
-
我认为你只能使用子类。
标签: ios swift swift-protocols protocol-extension