【发布时间】:2021-05-28 08:38:05
【问题描述】:
我正在尝试实现对协议的类型约束。在我当前的项目中,我有一个以下基本控制器。我也检查了this answer,但我不明白为什么它不起作用。
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。
但是,当我尝试在另一个不符合 protocol A 的 UIViewController 中符合 protocol B 时,没有错误。
class AnotherVC: UIViewController {
}
extension AnotherVC: B {
func confirm() {
}
}
如果其他视图控制器不符合 protocol A 并从 BaseViewController 继承,我如何限制其他视图控制器符合 protocol B
【问题讨论】:
-
因为 AnotheVC 仍然是 UIViewController 的子类,而 BaseViewController 也是 UIViewController 的子类,所以它可以工作。所以,基本上 BaseViewController 与 UIViewController 有一个 IS-A 关系。
-
我明白你的意思,但它也需要符合 A 协议,因为 & ? @TusharSharma
-
协议 A 与 AnyObject 具有 IS-A 关系。因此,它基本上意味着任何类类型都可以实现该协议(引用类型)。当你说
extension AnotherVC: B并且B 有一个约束self应该是UIViewController & Class。这正是你所拥有的,AnotherVC是一个类,也是 UIViewController 的子类。 -
是的,你现在我明白了。当我约束 Self: BaseViewController & A 我应该
AnotherVC必须符合协议 B。有什么方法可以实现我需要的吗? @TusharSharma
标签: swift uiviewcontroller swift-protocols