我们需要一些建议.我试图做这样的抽象,所以我有很多不同的响应.在项目的某个时候,我们意识到我们的一些响应具有id属性,我们想为这些响应建立一些公共逻辑,而不关心这个响应是什么.唯一重要的是,这些回复包含id
个字段.我们引入了WithIdResponse
,并为包含id
的响应创建了扩展,这些扩展在实现的体系 struct 的上下文中很有用.
接下来,我们为Single
创建了react 式伪扩展,它执行简单的映射WithIdResponse?
、->
、String?
,我们将其称为运算符id
.
现在,SWIFT的问题是,当我们使用这id
个运算符时,编译器会出现这样的错误:Referencing instance method 'id()' on 'PrimitiveSequence' requires the types 'ItemAResponse' and 'any WithIdResponse' be equivalent
我们试图理解这一信息,但我们失败了.我们的假设做错了什么吗?
import Foundation
import RxSwift
protocol WithIdResponse {
var id: String { get }
}
extension PrimitiveSequence where Element == WithIdResponse?, Trait == SingleTrait {
func id() -> Single<String?> {
self.map { $0?.id }
}
}
struct ItemAResponse {
let id: String
}
extension ItemAResponse: WithIdResponse {}
struct ItemBResponse {
let id: String
}
extension ItemBResponse: WithIdResponse {}
let subjectA: BehaviorSubject<ItemAResponse?> = BehaviorSubject(value: nil)
let subjectB: BehaviorSubject<ItemBResponse?> = BehaviorSubject(value: nil)
let singleA = subjectA.asSingle().id() // HERE WE HAVE ERROR