Swift 如何将PublishSubject呈现为MVVM中可观察的对象?
我有这样的想法:Swift 如何将PublishSubject呈现为MVVM中可观察的对象?,swift,mvvm,protocols,rx-swift,Swift,Mvvm,Protocols,Rx Swift,我有这样的想法: protocol ViewModel: class { var eventWithInitialValue: Observable<Int> { get } } class ViewModelImpl: ViewModel { let eventWithInitialValue: BehaviorSubject<Int> = BehaviorSubject(value: 0) init() { eventWi
protocol ViewModel: class {
var eventWithInitialValue: Observable<Int> { get }
}
class ViewModelImpl: ViewModel {
let eventWithInitialValue: BehaviorSubject<Int> = BehaviorSubject(value: 0)
init() {
eventWithInitialValue.onNext(1)
}
}
class ViewController: UIViewController {
weak var viewModel: ViewModel?
private let bag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
viewModel?
.eventWithInitialValue
.subscribe(onNext: {
print($0)
}).disposed(by: bag)
}
}
协议视图模型:类{
var eventWithInitialValue:可观察{get}
}
类ViewModelImpl:ViewModel{
让eventWithInitialValue:BehaviorSubject=BehaviorSubject(值:0)
init(){
eventWithInitialValue.onNext(1)
}
}
类ViewController:UIViewController{
弱var viewModel:viewModel?
私人出租包=处置包()
重写func viewDidLoad(){
super.viewDidLoad()
视图模型?
.eventWithInitialValue
.订阅(onNext:{
印刷品(0美元)
}).处置(由:袋)
}
}
我想与viewModel
字段进行通信,这些字段来自ViewController
,作为可观察对象。但是在viewModel
内部,该字段应该是[OneOf]主题
类型(出于安全原因)
上面的实现存在下一个编译时错误->类型“ViewModelImpl”不符合协议“ViewModel”
有人能帮助您实现这些要求吗?您的问题不在于Rx,您的错误与您的协议有关
这将解决当前的问题
protocol ViewModel: class {
var eventWithInitialValue: BehaviorSubject<Int> { get }
}
class ViewModelImpl: ViewModel {
var eventWithInitialValue: BehaviorSubject<Int> = BehaviorSubject(value: 0)
init() {
eventWithInitialValue.onNext(1)
}
}
协议视图模型:类{
var eventWithInitialValue:BehaviorSubject{get}
}
类ViewModelImpl:ViewModel{
var eventWithInitialValue:BehaviorSubject=BehaviorSubject(值:0)
init(){
eventWithInitialValue.onNext(1)
}
}
我认为您得到的类型“viewmodeimpl”不符合协议“ViewModel”
,因为您在实现中将事件的initialvalue类型定义为BehaviorSubject。
我的建议是这样的
protocol ViewModel {
var data: Observable<Int> { get}
}
class ViewModelImpl: ViewModel {
private let dataSubject = BehaviorSubject(value: 1)
var data: Observable<Int> {
return dataSubject
}
}
协议视图模型{
var数据:可观察{get}
}
类ViewModelImpl:ViewModel{
私有let dataSubject=BehaviorSubject(值:1)
var数据:可观察{
返回数据主体
}
}
谢谢您的回答,但您没有完全理解我的问题您的viewModel为零。。。您对该代码有几个问题。。。您没有对其进行事件初始化弱var viewModel:viewModel?在这种情况下,这一切都无关紧要。ViewModel将从外部提供