ios - 如何声明也符合协议(protocol)的特定类的属性?

标签 ios swift protocols

假设我想创建一个属性,它是 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 中没有办法。不过,您有几个选择:

  1. 将所需的 UIViewController 方法添加到您的委托(delegate)协议(protocol)(我最喜欢的选项)
  2. 为您的 View Controller 创建一个父类(super class),它是 UIViewController 的子类并实现 MyDelegateProtocol。将您的变量声明为该类型
  3. 存储两个对您的“代表”的引用。一个是 MyDelegateProtocol 的,另一个是 UIViewController 的
  4. 使您的类通用,但这将无法从 Objective-C 访问

关于ios - 如何声明也符合协议(protocol)的特定类的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25172430/

相关文章:

ios - 如何将符合具有关联类型的协议(protocol)的不同类型添加到集合中?

ios - 通过自定义协议(protocol)符合协议(protocol) MKAnnotation

ios - 无法在具有@objc 属性的协议(protocol)中使用自定义类?

ios - 如何在 iOS 中使用带有 UNNotification 的通知服务扩展

ios - UIView原点不等于0

ios - NSArray 中的 NSObjects 的属性是否发生变化,或者它们是否必须再次添加到 NSArray?

swift - 是否可以在 SwiftUI 中提供服务并将数据推送到 View 并更新 UI?

ios - 滚动时如何在 UITableView 上保留自定义选择格式

arrays - 如何按作为结构​​值包含的数组进行过滤

Swift Firebase 按最后 10 个排序,然后显示 10 个新值