首页 > 解决方案 > 可观察地图 Rxswift 中的切换案例

问题描述

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

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

标签: iosswiftreactive-programmingrx-swift

解决方案


问题可能是这一行:

var item  : AddressItemViewModel!

使用隐式展开变量可能会导致致命错误。想想当你的type被设置为.shipping$0.address.isShipping被设置为false(或者typebilling$0.address.isBillingfalse)时会发生什么?该item变量将设置为nil,但item要求的类型为非零。我认为最好的选择是使用compactMap而不是map只传递非零值:

 $0.compactMap {
      switch(type){
           case .shipping where $0.address.isShipping:
                fallthrough
           case .billing where $0.address.isBilling:
               return AddressItemViewModel(with: $0.address)
           default:
               return nil
      }
    }

推荐阅读