gpt4 book ai didi

swift - 关联类型的协议(protocol)继承

转载 作者:行者123 更新时间:2023-12-04 07:23:34 25 4
gpt4 key购买 nike

我有一个描述路由器行为的基本协议(protocol):

protocol BaseRouterProtocol: AnyObject {
associatedtype View: MainView
func dismiss(viewController: ViewController<View>?)
}

extension BaseRouterProtocol {
func dismiss(viewController: ViewController<View>?) {
viewController?.navigationController?.popViewController(animated: true)
}
}

我想像这样将此协议(protocol)采用到另一个:

protocol StartRouterProtocol: BaseRouterProtocol where View == StartView {
func showTermsVC()
func showSignInVC()
}

但是当我创建这种类型的变量时:

let router: StartRouterProtocol

编译器抛出一个错误:

Protocol 'StartRouterProtocol' can only be used as a generic constraint because it has Self or associated type requirements

如果我已经描述了我期望的类型,为什么会发生这种情况?

最佳答案

一旦协议(protocol)具有关联类型,该协议(protocol)就不能单独用作实例声明的类型——只能用于通用约束和声明一致性。

所以在这种情况下,Swift 会说“是的,但是 StartRouterProtocol 的关联类型的具体类型是什么?”

在这种情况下,它要求您:

  1. 直接使用具体类型,即 let router: MyStartViewClass 与此一致性声明,其他地方:class MyStartViewClass: StartRouterProtocol { ... )
  2. 或者,将对具体类型的需求推上一层,作为通用约束,即
class MyRouterController<T: StartRouterProtocol> {
let router: T
}

这可能不是您所希望的,但不幸的是关联类型增加了您使用协议(protocol)的方式的复杂性,尤其是当您熟悉其他语言的泛型和接口(interface)时。 (即 Java/C# 接口(interface))

您可以通过使用称为“类型删除”的概念来解决关联类型的某些方面——但这可能会导致其他问题和复杂性。

这里有一些可能有帮助的进一步阅读:https://medium.com/monstar-lab-bangladesh-engineering/swift-from-protocol-to-associatedtype-then-type-erasure-a4093f6a2d08

关于swift - 关联类型的协议(protocol)继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68349400/

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