Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何使协议只符合要求的类?_Swift_Uiviewcontroller_Swift Protocols - Fatal编程技术网

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。一旦我们提供了这两个规则,它就可以工作了。或者是我错过了什么。你说得完全正确,我认为现在事情很复杂,我希望它能正常工作:)