我有一个 Swift 协议,它定义了如下方法:
protocol MyProtocol {
class func retrieve(id:String) -> Self?
}
我有几个符合此协议的不同类:
class MyClass1 : MyProtocol { ... }
class MyClass2 : MyProtocol { ... }
class MyClass3 : MyProtocol { ... }
实施为retrieve
每个子类中的方法几乎相同。我想将这些函数的通用实现拉入符合协议的共享超类中:
class MyBaseClass : MyProtocol
{
class func retrieve(id:String) -> MyBaseClass?
}
class MyClass1 : MyBaseClass { ... }
class MyClass2 : MyBaseClass { ... }
class MyClass3 : MyBaseClass { ... }
这种方法的问题是我的协议定义了返回类型retrieve
方法作为类型Self
,这才是我最终真正想要的。但是,结果我无法实施retrieve
以这种方式在基类中,因为它会导致编译器错误MyClass1
, MyClass2
, and MyClass3
。每个类都必须符合它们继承的协议MyBaseClass
。但因为该方法是用返回类型实现的MyBaseClass
并且协议要求它是MyClass1
,它说我的类不符合协议。
我想知道是否有一种干净的方法来实现引用的协议方法Self
从基类中键入一个或多个方法。我当然可以在基类中实现一个不同名称的方法,然后让每个子类通过调用其超类的方法来实现协议来完成工作,但这对我来说似乎不是特别优雅。
我在这里缺少更直接的方法吗?
这应该有效:
protocol MyProtocol {
class func retrieve(id:String) -> Self?
}
class MyBaseClass: MyProtocol {
required init() { }
class func retrieve(id:String) -> Self? {
return self()
}
}
required init() { }
有必要确保任何子类派生自MyBaseClass
has init()
初始化程序。
请注意,此代码会使 Swift Playground 崩溃。我不知道为什么。所以尝试一下真实的项目。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)