关于无法将Observable<Store>转换为预期参数类型Observable<Store?>的技术问题咨询
嘿,这个问题我做RxSwift相关项目时也碰到过,核心原因其实是Swift泛型的不变性在起作用——哪怕Store和Store?是关联类型,但Observable<Store>和Observable<Store?>在编译器眼里完全是两种独立的类型,不会自动帮你完成转换。结合你的场景,给你几个实用的解决方向:
显式转换非可选Observable为可选类型
既然你确定storeSubject的值始终存在,最简单的办法就是用map操作符给它包一层可选包装:let optionalStoreSubject = storeSubject.map { $0 as Store? } // 把转换后的实例传给StoreMock let mock = StoreMock(state: stateSubject, store: optionalStoreSubject)转换后的Observable永远只会发出非nil的
Store?值,既满足了构造函数的参数要求,也完全符合你的业务逻辑。修改StoreMock的构造函数参数类型(如果有权限的话)
如果你能修改StoreMock的代码,直接把store参数的类型从Observable<Store?>改成Observable<Store>会更直接——毕竟你明确知道这个值始终存在,没必要用可选类型增加额外的包装和判断成本。自定义Observable扩展简化转换(可选)
可以给Observable写个小扩展,快速实现非可选转可选的操作,后续复用起来更方便:extension ObservableType { func asOptional() -> Observable<Element?> { return map { $0 } } }之后你就能直接调用
storeSubject.asOptional()得到Observable<Store?>,代码会更简洁。
补充说明
Swift的泛型是不变的,这意味着Observable<T>既不是Observable<T?>的子类也不是父类,哪怕T和T?存在可选关联关系。编译器不会自动处理这种容器类型的转换,必须通过显式的操作符(比如map)来完成类型适配。
内容的提问来源于stack exchange,提问作者user3492121

