如何声明一个符合协议的特定类的属性?

时间:2014-08-07 00:29:21

标签: ios swift protocols

假设我想创建一个属性,它是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问题的书,但我还没有找到我正在寻找的东西。

4 个答案:

答案 0 :(得分:4)

首先,我认为这是代码味道。如果您希望委托成为多个事物,则很可能存在关注点分离问题。

话虽如此,如果你仍然想要这样做,那么Swift就没有办法了。你有几个选择:

  1. 将所需的UIViewController方法添加到您的委托协议(我最喜欢的选项
  2. 为您的视图控制器创建一个超类,它是UIViewController的子类并实现MyDelegateProtocol。将变量声明为该类型
  3. 将两个引用存储到“委托”。一个是MyDelegateProtocol,另一个是UIViewController
  4. 使您的类具有通用性,但无法从Objective-C
  5. 访问

答案 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?
    ...
}