我在视图模型中有一个反应式闭包,用于根据类型(发货或计费(返回和排序网络呼叫中的数据。
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
处崩溃。
所以我的问题是如何在不使用可为null的对象的情况下对项进行排序?谢谢
错误:
线程1:致命错误:在展开可选值
问题可能是这一行:
var item : AddressItemViewModel!
使用隐式展开变量可能会导致致命错误。想想当您的type
设置为.shipping
,$0.address.isShipping
设置为false
(或者type
是billing
,$0.address.isBilling
是false
(时会发生什么?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
}
}