Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何将PublishSubject呈现为MVVM中可观察的对象?_Swift_Mvvm_Protocols_Rx Swift - Fatal编程技术网

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将从外部提供