我正在尝试使用通用参数将通用数据注入视图控制器T
。我有一个协议Coordinator
,它声明一个关联类型 T 和一个data
类型 的变量T
。我的AppCoordinator
采用Coordinator
协议并将 的类型声明T
为String
。在我的AppCoordinator
课程中,我尝试使用通用参数 在视图控制器上设置数据T
。
我的想法是,当类实现 Navigable 协议时,它会采用一种具体的WelcomeViewController
类型,因此我应该能够设置 AppCoordinator 中的数据类型(在本例中为 String),并且也能够在视图控制器上设置该类型。不知何故,我认为为了使其工作,Coordinator 协议中的类型 T 必须与 Navigable 协议中的类型 T 匹配,但是当我尝试通过在 Coordinator 协议中进行设置来执行此操作时,我收到此错误:“无法从‘Navigable’访问关联类型‘T’;请改用具体类型或通用参数基”。AppData
data
associated type T: Navigable.T
我已经阅读了如何将依赖项注入 iOS 视图控制器?,以及以下章节:泛型解决的问题、泛型函数、类型参数、命名类型参数、类型约束、关联类型、泛型 Where 子句、具有泛型 Where 子句的关联类型、来自泛型。
我该如何解决这个问题?
protocol Coordinator<T> {
associatedtype T
var navigationController: UINavigationController { get }
var data: T? { get }
func start<T>(data: T?, viewController: any Navigable)
}
class AppCoordinator: Coordinator {
typealias T = String
var data: T?
init(data: T? = nil, navigationController: UINavigationController) {
self.data = data
self.navigationController = navigationController
}
var navigationController: UINavigationController
func start<T>(data: T?, viewController: any Navigable) {
var viewController = viewController
viewController.data = data
}
}
protocol Navigable<T> where T == AppData {
associatedtype T
var data: T? { get set }
}
enum AppData {
case coordinatorData
}
class WelcomeViewController: UIViewController, Navigable {
var data: AppData?
var appCoordinator: (any Coordinator)?
typealias T = AppData
override func viewDidLoad() {
setUp()
}
}
您可以向您的功能添加通用约束
start
以实现您的目标:现在您可以像这样使用您的协调器: