可观察地图Rxswift中的开关案例

时间:2018-12-11 20:24:45

标签: ios swift reactive-programming rx-swift

我在视图模型中有一个反应式闭包,可根据类型(运输或计费)从网络调用中返回并排序数据。

Observable.combineLatest(input.headerRefresh, type).flatMapLatest({ (header, type) -> Observable<[AddressItemViewModel]> in
    var els : Observable<[AddressItemViewModel]>

     els = self.request()
        .trackActivity(self.loading)
        .trackActivity(self.headerLoading)
        .trackError(self.error)

    return els.map{
        $0.map {
            print(type)
            var item  : AddressItemViewModel!
            switch(type){
            case .shipping:
                if($0.address.isShipping){
                    item = AddressItemViewModel(with: $0.address)
                }

            case .billing:
                if($0.address.isBilling){
                    item = AddressItemViewModel(with: $0.address)
                }
            }

            return item // error
        }
    }

   }).subscribe(onNext: { (items) in
        elements.accept(items)
    }).disposed(by: rx.disposeBag)

在视图控制器中订阅elements时,应用程序在return item崩溃。

所以我的问题是如何在不使用可为空的对象的情况下对项目进行排序?谢谢。

错误:

  

线程1:致命错误:展开包装时意外发现nil   可选值

1 个答案:

答案 0 :(得分:1)

问题可能是此行:

var item  : AddressItemViewModel!

使用隐式展开的变量可能会导致致命错误。想想将type设置为.shipping并将$0.address.isShipping设置为false(或者typebilling和{{1}时会发生什么}是$0.address.isBilling)? false变量将设置为item,但是nil的类型必须为非nil。我认为最好的选择是使用item而不是compactMap仅传递非null值:

map