加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 06:04:00 所属栏目:百科 来源:网络整理
导读:我的应用程序有一个详细视图控制器的协议,说明他们必须有一个viewModel属性: protocol DetailViewController: class { var viewModel: ViewModel? {get set}} 我也有几个不同的类实现协议: class FormViewController: UITableViewController,DetailViewCo
我的应用程序有一个详细视图控制器的协议,说明他们必须有一个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,但我找不到任何地方,任何地方建议我可以如何去。

我想你可以通过添加一个(空)扩展到UIViewController,然后指定你的detailViewController属性使用空扩展和你的DetailViewController的组合协议。喜欢这个:
protocol UIViewControllerInject {}
extension UIViewController : UIViewControllerInject {}

现在UIViewController的所有子类都满足协议UIViewControllerInject。然后,简单地:

typealias DetailViewControllerComposed = protocol<DetailViewController,UIViewControllerInject>

class MasterViewController : UITableViewController {
  var detailViewController : DetailViewControllerComposed?
  // ...
}

但是,这不是特别“自然”。

===编辑,加法===

实际上,如果你使用我建议的UIViewControllerInject定义你的DetailViewController,你可以使它更好一些。像这样:

protocol UIViewControllerInject {}
extension UIViewController : UIViewControllerInject {}

protocol DetailViewController : UIViewControllerInject { /* ... */ }

现在你不需要显式编写一些东西(我的DetailViewControllerComposed),并可以使用DetailViewController?作为detailViewController的类型。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读