我在视图模型中有一个反应式闭包,可根据类型(运输或计费)从网络调用中返回并排序数据。
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 可选值
答案 0 :(得分:1)
问题可能是此行:
var item : AddressItemViewModel!
使用隐式展开的变量可能会导致致命错误。想想将type
设置为.shipping
并将$0.address.isShipping
设置为false
(或者type
为billing
和{{1}时会发生什么}是$0.address.isBilling
)? false
变量将设置为item
,但是nil
的类型必须为非nil。我认为最好的选择是使用item
而不是compactMap
仅传递非null值:
map