【问题标题】:How do you create a base class with a weak delegate that conforms to a generic protocol?如何创建一个具有符合泛型协议的弱委托的基类?
【发布时间】:2018-05-27 08:08:46
【问题描述】:

我想为 UIView 创建一个基类,该基类要求委托符合 View 定义的特定协议。

class BaseView<P>: UIView {
    weak var delegate: P?
}

protocol MyProtocol {}

class MyView: BaseView<MyProtocol> {}

这给了我错误:“'weak' must not be applied to non-class-bound 'T';考虑添加具有类绑定的协议一致性”。

如何解决此错误?或者有什么解决办法?还是一开始就没有必要让委托变量变弱?提前致谢。

【问题讨论】:

    标签: ios swift generics delegates protocols


    【解决方案1】:

    由于weak 是分配给任何属于类类型而非结构的属性的属性,因此您必须将泛型参数显式约束为类类型,并且您可以这样做:

    class BaseView<P: AnyObject>: UIView {
        weak var delegate: P?
    }
    
    @objc protocol MyProtocol {
    
    }
    
    class MyView: BaseView<MyProtocol> {
    
    }
    

    只有一个需要澄清。通常要使协议成为类类型,通常您可以通过这种方式使其符合类:

    protocol MyProtocol: class { }
    

    但是,由于某种原因,如果您这样做,编译器会抛出错误。我了解到这是一个可以在此处了解更多信息的错误:

    How to require that a protocol can only be adopted by a specific class

    因此,添加 @objc 有助于消除警告和错误。

    【讨论】:

      【解决方案2】:

      您应该通过添加MyProtocol 为您的泛型添加类型约束,并创建一个符合MyProtocol 的类。

      您可以找到更多信息here

      更新代码:

      class BaseView<P: MyProtocol>: UIView {
          weak var delegate: MyProtocol?
      }
      
      protocol MyProtocol: class {}
      
      class MyProtocolImp: MyProtocol {
      
      }
      
      class MyView: BaseView<MyProtocolImp> {
      
      }
      

      但我不知道你为什么在课堂上使用P 参数。 你可以不用这个写:

      class BaseView: UIView {
          weak var delegate: MyProtocol?
      }
      
      protocol MyProtocol: class {}
      
      class MyView: BaseView {
      
      }
      

      【讨论】:

      • 我不认为这对我有用。我希望能够重用具有多种类类型(符合 MyProtocol)的 MyView,而在您的示例中,它只能与类 MyProtocolImp 一起使用。感谢您的回答,如果我错了,请纠正我。
      • @Myk 只需使用第二个示例。您可以使用任何符合MyProtocol 的类作为delegate
      • 那么我只能使用一种协议。我想要的是有多个不同的视图,例如蓝色视图和红色视图。我希望蓝色视图和红色视图都有自己的委托必须遵守的协议。所以 RedViewController: RedProtocol 和 BlueViewController: BlueProtocol。这样我可以创建类 blueView: BaseView 和 redView: BaseView 并传入协议而不是视图。我怎样才能用你的第二种方法做到这一点?似乎我只能将委托设置为一种特定的协议。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      相关资源
      最近更新 更多