我想为UIViews创建一个基类,要求委托符合View定义的特定协议。
class BaseView<P>: UIView {
weak var delegate: P?
}
protocol MyProtocol {}
class MyView: BaseView<MyProtocol> {}
这给了我错误:&#34;&#39;弱&#39;不得适用于非类别约束的&#39;;考虑添加具有类绑定的协议一致性&#34;。
如何修复此错误?或者有一些工作吗?或者首先让代理变量变弱是不是必要的?提前谢谢。
答案 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 {
}