如何解决协议可以用实现者在Swift中定义的功能扩展吗?
示例:
游乐场: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
这也将达到您的预期结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。