假设我想创建一个属性,它是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问题的书,但我还没有找到我正在寻找的东西。
答案 0 :(得分:4)
首先,我认为这是代码味道。如果您希望委托成为多个事物,则很可能存在关注点分离问题。
话虽如此,如果你仍然想要这样做,那么Swift就没有办法了。你有几个选择:
答案 1 :(得分:4)
3年后回答我自己的问题,Swift 4支持组合类和协议类型:
let delegate: UIViewController & MyDelegateProtocol
答案 2 :(得分:1)
在一年半之后回答我自己的问题,将未来的任何人指向this article,基本上回答了Swift 2中的问题。这不是严格可行的,但是使用协议扩展你可以非常接近。
答案 3 :(得分:0)
一个选项是参数化整个班级;遗憾的是,模板类不能用于Obj-C。
class MyClass<Delegate: protocol<UIViewController, MyDelegateProtocol>> {
...
let delegate: Delegate?
...
}