如何使用符合通用协议的弱委托创建基类?

时间:2018-05-27 08:08:46

标签: ios swift generics delegates protocols

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

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

protocol MyProtocol {}

class MyView: BaseView<MyProtocol> {}

这给了我错误:&#34;&#39;弱&#39;不得适用于非类别约束的&#39;;考虑添加具有类绑定的协议一致性&#34;。

如何修复此错误?或者有一些工作吗?或者首先让代理变量变弱是不是必要的?提前谢谢。

2 个答案:

答案 0 :(得分:2)

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

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有助于消除警告和错误。

答案 1 :(得分:1)

您应该通过添加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 {

}