繁体   English   中英

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

[英]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就没有办法了。 你有几个选择:

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM