【问题标题】:How to make protocol conformed by only required classes?如何使协议只符合必需的类?
【发布时间】: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 AUIViewController 中符合 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


【解决方案1】:

我不确定下面的代码是否是您需要的,如果您正在寻找,请告诉我,否则我很乐意删除我的答案。

protocol A:BaseViewController  {
    func execute()
}

protocol B:A {
    func confirm()
}

class BaseViewController: UIViewController {
    
}

class AnotherVC: B {
   
}

在上面的代码编译器会给出错误提示-:

“A”要求“AnotherVC”继承自“BaseViewController”

一旦你从BaseViewController继承AnotherVC,它会给出另一个错误提示-:

类型“AnotherVC”不符合协议“A”

一旦您确认实施错误将得到解决-:

class AnotherVC:BaseViewController, B {
    func confirm() {
        
    }
    
    func execute() {
        
    }
    
}

【讨论】:

  • 感谢您的努力和评论,但我想要实现的是,例如我有两个协议 A 和 B。我需要创建一个规则,如果一个类不符合协议A 也不能符合协议 B。
  • @atalayasa 我猜这就是代码的作用,当我用 B 实现 AnotherVC 时,编译器抱怨 AnotherVC 没有确认 BaseViewController 和协议 A。一旦我们提供了这两个规则,它就可以工作。还是我错过了什么。
  • 你说得对,我想的太复杂了,现在它按我的意愿工作了:)
猜你喜欢
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-19
  • 1970-01-01
相关资源
最近更新 更多