Swift 如何使协议只符合要求的类?
我试图在协议上实现类型约束。在我当前的项目中,我有以下基本控制器。我也检查过,但我不明白为什么它不起作用Swift 如何使协议只符合要求的类?,swift,uiviewcontroller,swift-protocols,Swift,Uiviewcontroller,Swift Protocols,我试图在协议上实现类型约束。在我当前的项目中,我有以下基本控制器。我也检查过,但我不明白为什么它不起作用 class BaseViewController: UIViewController { } 我根据自己的要求声明了两个协议 protocol A: AnyObject { func execute() } extension A { func execute() { print("Execute") } } protocol
class BaseViewController: UIViewController {
}
我根据自己的要求声明了两个协议
protocol A: AnyObject {
func execute()
}
extension A {
func execute() {
print("Execute")
}
}
protocol B {
func confirm()
}
extension B where Self: BaseViewController & A {
func confirm() {
}
}
我试图实现的是防止所有不符合协议A和BaseViewController
的类也不符合协议B
但是,当我尝试在另一个不符合协议A的UIViewController
中符合协议B时,没有错误
class AnotherVC: UIViewController {
}
extension AnotherVC: B {
func confirm() {
}
}
如果其他视图控制器不符合
协议A
并且继承自BaseViewController
我不确定下面的代码是否是您需要的,请务必让我知道这是否是您正在寻找的,否则我很乐意删除我的答案
protocol A:BaseViewController {
func execute()
}
protocol B:A {
func confirm()
}
class BaseViewController: UIViewController {
}
class AnotherVC: B {
}
在上面的代码中,编译器将给出错误提示-:
“A”要求“AnotherVC”继承自“BaseViewController”
一旦您从BaseViewController
继承了另一个VC,它将给出另一个错误,提示-:
类型“AnotherVC”不符合协议“A”
确认实施后,将解决错误-:
class AnotherVC:BaseViewController, B {
func confirm() {
}
func execute() {
}
}
这是因为AnotheVC仍然是UIViewController的子类,而BaseViewController也是UIViewController的子类。因此,基本上BaseViewController与UIViewController有一个IS-a关系。我明白你的观点,但它也需要符合协议,因为&@TusharSharmaprotocol与任何对象都有IS-A关系。因此,它基本上意味着任何类类型都可以实现该协议(引用类型)。当您说另一个扩展时,vc:B和B有一个约束,即
self
应该是UIViewController&Class
。这正是你所拥有的,AnotherVC
是UIViewController的一个类,也是它的子类。是的,你现在是,我明白了。当我约束Self:BaseViewController&A时,我认为另一个vc必须符合协议B。有什么方法可以实现我需要的吗@TusharSharmaThanks为您的努力和评论,但我想实现的是,例如,我有两个协议A和B。我需要创建一个规则,如果一个类不符合协议A,也不能符合协议B。@Atalaysa我猜这就是代码所做的,当我用B实现另一个VC时,编译器抱怨另一个VC没有确认BaseViewController和协议A。一旦我们提供了这两个规则,它就可以工作了。或者是我错过了什么。你说得完全正确,我认为现在事情很复杂,我希望它能正常工作:)