我的应用程序有一个详细视图控制器的协议,说明他们必须有一个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的类型。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。