ios - 可观察地图 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
解决方案
问题可能是这一行:
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
}
}
推荐阅读
- java - java.lang.NullPointerException:使用 firebase 时
- javascript - 如何使用噩梦点击此链接?
- mysql - UNIX_TIMESTAMP 字段分区一整年
- ios - 奇怪的自动布局问题
- r - 在计算的 data.table 中创建新列,名称存储在另一个字符变量中
- angular - Angular 5:无法读取未定义的属性“USERID”
- jquery - 如何在不显示的情况下将字符串添加到字段输入?
- ionic-framework - 使用 Adobe Analytics 构建 Ionic
- javascript - 将coinmarketcap api v2与谷歌表格一起使用-通过多次调用添加到js对象
- javascript - 在这种情况下,$('id').on('click', this.method.bind(this)) 究竟做了什么?