gpt4 book ai didi

swift - 引用符合协议(protocol)的类

转载 作者:搜寻专家 更新时间:2023-10-31 22:14:06 25 4
gpt4 key购买 nike

假设我有一个如下所示的协议(protocol):

protocol Foo {
var bar: Bool { get set }
}

现在我有了符合 Foo 协议(protocol)的 View Controller ;

class FooViewController: UIViewController, Foo {
...
}

在另一个类中我想做这样的事情:

class FooClass {

var viewController: UIViewController? // this should conform to Foo protocol

func setViewController(viewController: UIViewController) {
if let fooVC = viewController as? Foo {
// viewController implements Foo protocol
self.viewController = fooVC
} else {
print("ViewController does not conform to Foo protocol")
}
}
}

在 Objective-C 中,我会有一个类似这样的引用:UIViewController<Foo> *vc说 vc 是符合 Foo 协议(protocol)的 UIViewController 类的对象。有 Swift 的等价物吗?

编辑:我猜是 not possible :(

最佳答案

警告:此解决方案可能会变得非常痛苦。

作为变通方法,您可以使用协议(protocol)组合并最终使用扩展

在您的示例中,您可能只对 UIViewController 符合的 UIResponder 协议(protocol)方法感兴趣。

typealias FooController = protocol<UIResponder, Foo>

class FooClass {

var viewController: FooController?

func setViewController(viewController: FooController) {
// viewController implements UIResponder and Foo protocols
}
}

但是 UIViewController 具有不符合任何协议(protocol)的属性和方法。在这种情况下,您可以创建一个包含所需方法的协议(protocol)并扩展 UIViewController

protocol ViewEvent {
func viewWillAppear(animated: Bool)
func viewDidAppear(animated: Bool)
func viewWillDisappear(animated: Bool)
func viewDidDisappear(animated: Bool)
}

extension UIViewController: ViewEvent {}

typealias FooController = protocol<UIResponder, ViewEvent, Foo>

关于swift - 引用符合协议(protocol)的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35535059/

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