我有一个协议如下

public protocol AdvancedWebSocketRequestProtocol: AnyObject {
    associatedtype ModelType: Codable

    var socketPath: String { get }
    var response: ModelResponse<ModelType>? { get set }
    var responseHandler: ((ModelType?, ServiceError?) -> Void)? { get set }

    func successListener(data: ModelType) -> Void
    func failureListener(error: ServiceError) -> Void
}

然后,我创建了一个符合该协议的对象

public class MyStocksWebSocketRequest: AdvancedWebSocketRequestProtocol {
    public typealias ModelType = [InvestmentStockResponse]

    public var socketPath: String = "/socket"
    public var config: [SocketIOClientConfiguration] = []
    public var response: ModelResponse<[InvestmentStockResponse]>?
    public var responseHandler: (([InvestmentStockResponse]?, ServiceError?) -> Void)?

    public func successListener(data: ModelType) { }
    public func failureListener(error: ServiceError) { }
}

然后我想要有一个WebSocketManager类,并存储一个符合AdvancedWebSocketRequestProtocol的对象.因为有许多符合相同协议的请求类,我希望能够传递所有这些类.

这就是它看起来的样子

class WebSocketManager {
    private let request: AdvancedWebSocketRequestProtocol
    private let manager: SocketManager
    private let socket: SocketIOClient

    init(request: AdvancedWebSocketRequestProtocol) {
        self.request = request

    }
}

我得到以下错误,但我不认为这是正确的解决方案.

Use of protocol 'AdvancedWebSocketRequestProtocol' as a type must be written 'any AdvancedWebSocketRequestProtocol'

有什么方法可以存储对象并将其传递给WebSocketManager吗?

推荐答案

您可以使类成为泛型

class WebSocketManager<Request: AdvancedWebSocketRequestProtocol> {
    private let request: Request

    init(request: Request) {
        self.request = request

    }
}

或者您可以按照错误消息中的建议使用any

class WebSocketManager {
    private let request: any AdvancedWebSocketRequestProtocol

    init(request: some AdvancedWebSocketRequestProtocol) {
        self.request = request

    }
}

Ios相关问答推荐

iPhone:iOS 17.4中没有气压数据

UIBezierPath包含:方法不检测到厚度大于1像素的线上的touch

Xcode15.3上的生成错误:调用的对象类型';facebook::flipper::SocketCertificateProvider';不是函数或函数指针

swift|在具有自定义单元格的多个TableView中没有任何内容

SwiftUI-工作表不显示导航标题

当 .searchable 修饰符处于活动状态时,如何将变量设置为 false?

将 Riverpod 从 StateNotifier 修复为 NotifierProvider 以及应用程序生命周期监控

如何将 -fobjc-arc-exceptions 标志正确添加到 XCode 中?

无法从 Xcode 获取模拟器列表.请打开 Xcode 并try 直接从那里运行项目以解决剩余问题

UIControl 子类 - 按下时显示 UIMenu

视觉扫描无法识别 iOS16 上的 GS1 条码特殊字符

react 在 android 上运行的本机应用程序,但在 iOS 上出现问题,详细信息在描述中共享

帧过渡动画有条件地工作

我可以在 Apple-Watch 上使用 iPhone 的摄像头扫描 SwiftUi 中的二维码(例如用于登录)吗

如何将单个按钮传递到自定义 ConfirmationDialog

通过 segue 传递数据

iOS:以编程方式制作屏幕截图的最快、最高效的方法是什么?

Sierra 中的安全/协同设计: keys 串忽略访问控制设置和 UI 提示权限

Swift 中的日期到毫秒和回溯到日期

为给定的 UIColor 获取更亮和更暗的 colored颜色 变化