问题描述
示例:
游乐场:github
protocol A: class {}
extension A {
func someFunc() {
print("1")
}
}
class B {
weak var delegate: A?
func someTrigger() {
delegate?.someFunc()
}
}
class C: A {
lazy var b: B = {
let b = B()
b.delegate = self
return b
}()
func someFunc() {
print("2")
}
init() {
b.someTrigger()
}
}
let c = C()
/// printed 1
问题
在上面,您可以看到一个示例以更好地理解问题。因此,问题是:协议可以使用实现者(实现协议的类)定义的功能进行扩展吗?我认为示例代码的结果是意外的。可以以某种方式没有协议继承吗?
更新
我无法在协议someFunc()
(它是A
协议)中实现UIKit
。这就是为什么我要完全考虑这种架构/配置的原因。
解决方法
protocol A: class {
func someFunc()
}
extension A {
func someFunc() {
print("1")
}
}
class AA: A { }
现在,在AA类中,您可以使用默认实现(在扩展名中),也可以使用自定义实现覆盖它。因此,您必须在协议本身中定义一个函数,因为它是接口。
但是,不要在协议中定义它没有意义,这只是一个糟糕的设计,因为协议=类上的接口。
如果您想使用函数someFunc()
-您可以立即进行操作而无需重新声明,因为自从实现协议以来它就已经存在。
在扩展协议时不暴露协议本身的功能,就像扩展要在其中实现该协议的类一样。
更新:
protocol MyProtocol: class {
func myFunc()
}
extension MyProtocol where Self: UIKitProtocol {
func myFunc() {
}
}
class AA: UIKitProtocol,MyProtocol { }
定义您自己的协议
,经过一段时间的测试,您必须在someFunc()
协议声明中公开A
函数,以使{{1} }类被这样调用:
someFunc()
然后您将得到以下结果:
C
更新:您可以代替创建协议protocol A: class {
func someFunc()
}
的扩展,而创建另一个实现协议let c = C()
/// printed 2
的类并将其用于默认的A
这样的实现:
A
这也将达到您的预期结果。