[英]How to declare a property of a particular class which is also protocol conformant?
假设我想创建一个属性,它是UIViewController的子类,并且符合协议MyDelegateProtocol。 在Objective-C中,我会写一些类似于:
@property (strong, nonatomic) UIViewController<MyDelegateProtocol> *delegate;
但是,我不知道如何在Swift中写这个。 我知道如何声明一个符合协议的属性,或者一个特定类型的属性:
let delegate : MyDelegateProtocol?
let delegate : UIViewController?
但我无法弄清楚如何做到这两点。 如果我尝试类似的东西:
let delegate : UIViewController<MyDelegateProtocol> ?
然后我得到一个编译器错误关于Cannot specialize non-generic type 'UIViewController'
。 可能是因为我现在正在徘徊在仿制药领域。 我试过通过Swift关于协议的协议和其他Stack Overflow问题的书,但我还没有找到我正在寻找的东西。
首先,我认为这是代码味道。 如果您希望委托成为多个事物,则很可能存在关注点分离问题。
话虽如此,如果你仍然想要这样做,那么Swift就没有办法了。 你有几个选择:
3年后回答我自己的问题,Swift 4支持组合类和协议类型:
let delegate: UIViewController & MyDelegateProtocol
一年半之后回答我自己的问题,将未来的任何人都指向本文 ,它基本上回答了Swift 2中的问题。这不是严格可能的,但是使用协议扩展可以非常接近。
一种选择是参数化整个班级; 遗憾的是,无法从Obj-C使用模板类。
class MyClass<Delegate: protocol<UIViewController, MyDelegateProtocol>> {
...
let delegate: Delegate?
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.