gpt4 book ai didi

swift - 如何声明具有类型并实现协议(protocol)的变量?

转载 作者:行者123 更新时间:2023-11-28 07:52:03 25 4
gpt4 key购买 nike

我的应用有一个详细 View Controller 的协议(protocol),声明它们必须有一个 viewModel 属性:

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

我还有一些实现该协议(protocol)的不同类:

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

class MapViewController: UIViewController, DetailViewController {
// ...
}

我的主视图 Controller 需要一个可以设置为任何实现 DetailViewController 协议(protocol)的 UIViewController 子类的属性。

不幸的是,我找不到任何关于如何执行此操作的文档。在 Objective-C 中,这将是微不足道的:

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

似乎在 Swift 中没有任何可用的语法来执行此操作。我最接近的是在我的类定义中声明一个泛型:

class MasterViewController<T where T:UIViewController, T:DetailViewController>: UITableViewController {
var detailViewController: T?
// ...
}

但随后我收到一条错误消息,指出“类‘MasterViewController’未实现其父类(super class)的必需成员”

这看起来在 Swift 中应该和在 Objective-C 中一样容易,但我找不到任何地方可以建议我如何去做。

最佳答案

我认为你可以通过向 UIViewController 添加一个(空的)扩展,然后使用空扩展和你的 的组合协议(protocol)指定你的 detailViewController 属性来实现>细节 View Controller 。像这样:

protocol UIViewControllerInject {}
extension UIViewController : UIViewControllerInject {}

现在 UIViewController 的所有子类都满足协议(protocol) 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 的类型。

关于swift - 如何声明具有类型并实现协议(protocol)的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49385746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com