我的应用程序有一个用于详细视图控制器的协议,指出它们必须具有一个viewModel属性:
viewModel
protocol DetailViewController: class { var viewModel: ViewModel? {get set} }
我也有一些实现协议的不同类:
class FormViewController: UITableViewController, DetailViewController { // ... } class MapViewController: UIViewController, DetailViewController { // ... }
我的主视图控制器需要一个可以设置为UIViewController实现该DetailViewController协议的任何子类的属性。
UIViewController
DetailViewController
不幸的是,我找不到有关如何执行此操作的任何文档。在Objective-C中,这是微不足道的:
@property (strong, nonatomic) UIViewController<DetailViewController>;
看来,Swift中没有可用的语法来做到这一点。我最接近的是在类定义中声明一个泛型:
class MasterViewController<T where T:UIViewController, T:DetailViewController>: UITableViewController { var detailViewController: T? // ... }
但是然后我得到一个错误,说“类’MasterViewController’没有实现其超类的必需成员”
在Swift中似乎应该像在Objective-C中一样容易,但是我在任何地方都找不到任何建议可以解决该问题的方法。
从Swift 4开始,您现在可以执行此操作。
Swift 4实现了SE-0156(类和子类型存在)。
等效于此Objective-C语法:
@property (strong, nonatomic) UIViewController<DetailViewController> * detailViewController;
现在在Swift 4中看起来像这样:
var detailViewController: UIViewController & DetailViewController
本质上,您需要定义一个变量符合的类,以及它实现的N种协议。有关更多详细信息,请参见链接的文档。