我们需要一些建议.我试图做这样的抽象,所以我有很多不同的响应.在项目的某个时候,我们意识到我们的一些响应具有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

推荐答案

您要求该元素为Optional<any WithIdResponse>.您需要您的泛型类型才能实现任何WithIdResponse.

以下是你如何做到这一点:

extension PrimitiveSequence where Trait == SingleTrait {
    func id<Wrapped>() -> Single<String?> where Element == Optional<Wrapped>, Wrapped: WithIdResponse {
        self.map { $0?.id }
    }
}

顺便说一句,你知道Swift 的图书馆里已经有一种Identifiable型了吗?我建议你使用它,而不是自己制作.

大概是这样的:

extension PrimitiveSequence where Trait == SingleTrait {
    func id<Wrapped>() -> Single<Wrapped.ID?> where Element == Optional<Wrapped>, Wrapped: Identifiable {
        self.map { $0?.id }
    }
}

struct ItemAResponse: Identifiable {
    let id: String
}

let subjectA: BehaviorSubject<ItemAResponse?> = BehaviorSubject(value: nil)

let singleA = subjectA.asSingle().id() // This is a `PrimitiveSequence<SingleTrait, String?>`

Swift相关问答推荐

如何使用swift宏生成一个带有关联值的枚举?

带有文本输入自动大小写修饰符的SwiftUI Textfield问题

SWIFT异步/等待,多个监听程序

如何避免切换视图递归onChange调用SwiftUI

为什么变量不存储在 Swift 的过程数据区中

UIImage和UIimage.pngData返回两个不同的图像

领域异常中的相同方法:发送到实例的无法识别的 Select 器

使用 swift 的 Firebase 身份验证

Firebase removeObserver 在 Swift 5 中不起作用

从 Swift Vapor Server 中调用 ShazamKit

在主要参与者中启动分离任务和调用非隔离函数之间的区别

自定义 DispatchQueue 服务质量

`let case(value)` 和 `case(let value)` 之间的区别 (Swift)

Swift初始化具有可变ID的重复值数组

展开 List 中的 HStack 以端到端但不是从上到下,因此看起来项目之间有更宽的空间

找不到接受提供的参数的/的重载

如何使用 Swift/iOS 为人类书写的笔画制作动画?

Xcode 7.3 Swift 的语法高亮和代码完成问题

从 NSData 对象在 Swift 中创建一个数组

如何在 Swift 中将对象归零