一尘不染

如何声明具有类型并实现协议的变量?

swift

我的应用程序有一个用于详细视图控制器的协议,指出它们必须具有一个viewModel属性:

protocol DetailViewController: class {
    var viewModel: ViewModel? {get set}
}

我也有一些实现协议的不同类:

class FormViewController: UITableViewController, DetailViewController {
    // ...
}

class MapViewController: 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中一样容易,但是我在任何地方都找不到任何建议可以解决该问题的方法。


阅读 259

收藏
2020-07-07

共1个答案

一尘不染

从Swift 4开始,您现在可以执行此操作。

Swift 4实现了SE-0156(类和子类型存在)。

等效于此Objective-C语法:

@property (strong, nonatomic) UIViewController<DetailViewController> * detailViewController;

现在在Swift 4中看起来像这样:

var detailViewController: UIViewController & DetailViewController

本质上,您需要定义一个变量符合的类,以及它实现的N种协议。有关更多详细信息,请参见链接的文档。

2020-07-07