Swift 使用泛型将其他道具注入viewmodel
接下来,我在我的应用程序中创建了一个MVVM模式 我有以下几点-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) 返回虚拟机 已附
协议视图模型类型{
关联类型依赖项
关联类型绑定
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
}
}