假设我想创建一个属性,它是 UIViewController 的子类,并且还符合协议(protocol) MyDelegateProtocol。在 Objective-C 中我会这样写:
@property (strong, nonatomic) UIViewController<MyDelegateProtocol> *delegate;
但是,我不确定如何在 Swift 中编写它。我知道如何声明符合协议(protocol)的属性或特定类型的属性:
let delegate : MyDelegateProtocol?
let delegate : UIViewController?
但我不太明白如何让它同时做到这两点。如果我尝试这样的事情:
let delegate : UIViewController<MyDelegateProtocol> ?
然后我收到关于Cannot specialize non-generic type 'UIViewController'
的编译器错误。可能是因为我现在正徘徊在泛型领域。我已经尝试查看有关协议(protocol)的 Swift 书籍以及有关协议(protocol)的其他 Stack Overflow 问题,但我还没有找到我正在寻找的内容。
最佳答案
首先,我认为这是一种代码味道。如果您希望委托(delegate)是多个事物,则很可能存在关注点分离问题。
话虽如此,如果您仍然想这样做,Swift 中没有办法。不过,您有几个选择:
- 将所需的 UIViewController 方法添加到您的委托(delegate)协议(protocol)(我最喜欢的选项)
- 为您的 View Controller 创建一个父类(super class),它是 UIViewController 的子类并实现 MyDelegateProtocol。将您的变量声明为该类型
- 存储两个对您的“代表”的引用。一个是 MyDelegateProtocol 的,另一个是 UIViewController 的
- 使您的类通用,但这将无法从 Objective-C 访问
关于ios - 如何声明也符合协议(protocol)的特定类的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25172430/