如何声明一个同样符合协议的特定类的属性?
假设我想创build一个属性,它是UIViewController的一个子类,也符合协议MyDelegateProtocol。 在Objective-C中,我会写如下的东西:
@property (strong, nonatomic) UIViewController<MyDelegateProtocol> *delegate;
不过,我不知道如何在Swift中写这个。 我知道如何声明一个符合协议的属性,或者是一个特定types的属性:
let delegate : MyDelegateProtocol? let delegate : UIViewController?
但是我不能完全弄清楚如何做到这一点。 如果我尝试像这样:
let delegate : UIViewController<MyDelegateProtocol> ?
然后我得到一个关于Cannot specialize non-generic type 'UIViewController'
的编译器错误。 可能是因为我现在正在stream浪到仿制药领域。 我试过通过协议和其他堆栈溢出有关协议的Swift书,但我还没有find相当我在找什么。
首先,我认为这是一种代码味道。 如果你想要一个委托是多件事情,最有可能的问题分离。
就这样说,如果你还想这样做,那么Swift就没有办法。 你有几个select:
- 将所需的UIViewController方法添加到您的委托协议( 我最喜欢的选项 )
- 为您的视图控制器创build一个超类,它是UIViewController的子类,并实现MyDelegateProtocol。 声明你的variables为这种types
- 存储两个引用到你的“委托”。 一个是MyDelegateProtocol,另一个是UIViewController
- 使你的类是通用的,但是这不能从Objective-C访问
3年后回答我自己的问题,Swift 4支持组合类和协议types:
let delegate: UIViewController & MyDelegateProtocol
一年半后回答我自己的问题,以便将来的任何人指向本文 ,这基本上回答了Swift 2中的问题。这不是严格可行的,但是使用协议扩展可以非常接近。
一种select是参数化你的整个class级; 不幸的是,Obj-C不能使用模板类。
class MyClass<Delegate: protocol<UIViewController, MyDelegateProtocol>> { ... let delegate: Delegate? ... }