Swift 使用泛型将其他道具注入viewmodel

Swift 使用泛型将其他道具注入viewmodel,swift,mvvm,rx-swift,Swift,Mvvm,Rx Swift,接下来,我在我的应用程序中创建了一个MVVM模式 我有以下几点- 协议视图模型类型{ 关联类型依赖项 关联类型绑定 init(依赖项:依赖项,绑定:绑定) } 可附加枚举{ 大小写分离(VM.Dependency) 案例附加(VM.Dependency,VM) 变异func绑定(bindings:VM.bindings)->VM{ 切换自身{ case let.detached(依赖项): 让vm=vm(依赖项:依赖项,绑定:绑定) self=.attached(依赖项,vm) 返回虚拟机 已附

接下来,我在我的应用程序中创建了一个MVVM模式

我有以下几点-

协议视图模型类型{
关联类型依赖项
关联类型绑定
init(依赖项:依赖项,绑定:绑定)
}
可附加枚举{
大小写分离(VM.Dependency)
案例附加(VM.Dependency,VM)
变异func绑定(bindings:VM.bindings)->VM{
切换自身{
case let.detached(依赖项):
让vm=vm(依赖项:依赖项,绑定:绑定)
self=.attached(依赖项,vm)
返回虚拟机
已附加案例(依赖项):
让vm=vm(依赖项:依赖项,绑定:绑定)
self=.attached(依赖项,vm)
返回虚拟机
}
}
}
视图控制器

最终类StartViewController:BaseViewController{
var viewModel:可附加!
变量绑定:StartViewModel.bindings{
让viewwillbeen=rx.sentMessage(#选择器(UIViewController.viewwillbeen))
.maptovid()
.asDriverOnErrorJustComplete()文件
返回StartViewModel.Bindings(
checkAuthState:视图将出现
)
}
}
扩展StartViewController:ViewModelAttaching{
func bind(视图模型:StartViewModel)->StartViewModel{
返回视图模型
}
}
视图模型

final类开始视图模型:ViewModelType{
typealias Dependency=HasAuthService
让我们检查一下:驱动程序
结构绑定{
让checkAuthState:驱动程序
}
私有出租dispebag=dispebag()
init(依赖项:依赖项,绑定:绑定){
authCheck=bindings.checkAuthState
.平面图{
返回dependency.authSvc.checkSession()
.maptovid()
.asDriver(onErrorJustReturn:())
}
}
}
这允许我按如下方式设置视图-

let viewController=StartViewController()
让avm:Attachable=.detached(依赖项)
让viewModel=viewController.attach(包装器:avm)
navigationController.SetViewController([viewController],动画:false)
这是伟大的作品,是非常可测试的,我很高兴它的工作原理。然而,我有一个场景,我需要将一些额外的道具传递到我的
ViewModel

例如,在配置文件场景中使用
userId

这个模式远离了
init
方法,因此我需要一种通过
.detached(detached)(dependencies)

类似于
.detached(依赖项,用户ID)
的东西,但是我不确定如何以通用方式实现这一点

我已经试过了-注意添加了
道具
道具


协议视图模型类型{
关联类型依赖项
关联类型绑定
关联型道具
init(依赖:依赖,绑定:绑定,props:props?)
}
可附加枚举{
大小写分离(VM.Dependency,VM.Props)
案例附加(VM.Dependency、VM、VM.Props)
变异func绑定(bindings:VM.bindings)->VM{
切换自身{
案例let.detached(依赖项、道具):
让vm=vm(依赖项:依赖项,绑定:绑定,道具:道具)
self=.attached(依赖项、虚拟机、道具)
返回虚拟机
附加案例(依赖项、道具):
让vm=vm(依赖项:依赖项,绑定:绑定,道具:道具)
self=.attached(依赖项、虚拟机、道具)
返回虚拟机
}
}
}
但是,这需要我用以下内容更新我的
ViewModel
-

**ViewModel**
```迅捷的
typealias道具=
init(依赖:依赖,绑定:绑定,props:props?)
这非常有效,除了我的情况,我不需要注射任何道具。然后我需要为未使用的东西指定一个类型

我试过这个-

typealias Props=Void?
init(依赖:依赖,绑定:绑定,props:props?)
然后用-

let avm:Attachable=.detached(依赖项,nil)

但是在我所有不接受任何东西的模型中添加
typealias Props=Void?
会让人感觉不舒服


如何以最具可扩展性和通用性的方式实现这一点?

与其引入
道具
,不如将附加信息隐藏在
相关性
后面? 例如,在您的案例中,您可以:

final类ProfileViewModel:ViewModelType{
让我们检查一下:驱动程序
结构依赖{
让authSvc:HasAuthService
让userId:String
}
结构绑定{
让checkAuthState:驱动程序
}
私有出租dispebag=dispebag()
init(依赖项:依赖项,绑定:绑定){
authCheck=bindings.checkAuthState
.平面图{
返回dependency.authSvc.checkSession()
.maptovid()
.asDriver(onErrorJustReturn:())
}
//使用dependency.userId
}
}