有这个协议吗

 public protocol URLSessionWebSocketTaskProtocol {

    func send(_ message: URLSessionWebSocketTask.Message, completionHandler: @escaping (Error?) -> Void)
    func receive(completionHandler: @escaping (Result<URLSessionWebSocketTask.Message, Error>) -> Void)
    func sendPing(pongReceiveHandler: @escaping (Error?) -> Void)
    func cancel(with closeCode: URLSessionWebSocketTask.CloseCode, reason: Data?)
    func resume()
}

并且在这一部分中符合它

extension URLSessionWebSocketTask: URLSessionWebSocketTaskProtocol {}

工作正常,但我需要在协议中有委托属性,因此将协议修改为

public protocol URLSessionWebSocketTaskProtocol {

func send(_ message: URLSessionWebSocketTask.Message, completionHandler: @escaping (Error?) -> Void)
func receive(completionHandler: @escaping (Result<URLSessionWebSocketTask.Message, Error>) -> Void)
func sendPing(pongReceiveHandler: @escaping (Error?) -> Void)
func cancel(with closeCode: URLSessionWebSocketTask.CloseCode, reason: Data?)
func resume()
var delegate: URLSessionTaskDelegate? { get set}

}

现在编译器告诉我们

协议"URLSessionWebSocketTaskProtocol"要求"委派"在iOS 13.0.0及更新版本中可用

目标minimun版本设置为iOS 13,因此有必要添加@available(iOS 13.0,*),但以任何方式添加了@available,并且没有任何更改.编译器一直告诉我们,协议要求委托在iOS 13中可用.

因此,我如何向协议中添加一个委托,而一致性并没有显示该错误.

推荐答案

URLSessionWebSocketTaskNSURLSessionTask,只有delegate个(!!)自iOS 15以来:

@interface NSURLSessionTask : NSObject <NSCopying, NSProgressReporting>

@property (nullable, retain) id <NSURLSessionTaskDelegate> delegate 
API_AVAILABLE(macos(12.0), ios(15.0), watchos(8.0), tvos(15.0));

所以,如果你想符合API合同,你需要在协议中也这样做,比如:

public protocol URLSessionWebSocketTaskProtocol {

    // ... other methods here

    @available(iOS 15, *)                               // << here !!
    var delegate: URLSessionTaskDelegate? { get set }

}

当然,另一种方法是将扩展限制为iOS15+,比如

@available(iOS 15, *)
extension URLSessionWebSocketTask: URLSessionWebSocketTaskProtocol {
}

已通过Xcode 13.2.1验证

Swift相关问答推荐

如何避免使用DispatchSemaphores时线程爆炸?

数据不会被ARC删除在swift'

在visionOS RealityView中使用.GenerateText时,未显示Reality Composer Promaterial 纹理

SwiftUI同心圆,通过逐渐出现来显示进度

像WebSocket一样接收实时更新,但通过异步/等待或组合

如何观察UIViewRepresentable中的多个变化?

在表单中对齐文本框

NavigationStack 和 TabView - 工具栏和标题不显示

在 Swift 的异步上下文中,如何指示我想要函数的同步版本?

使用 Async-Await 和 Vapor-Fluent 创建 CRUD 函数 - Swift 5.6

为 SwiftUI 中的属性提供默认值

关联满足约束时的快速协议方法

如何自己快速编写 Hashable 协议

如何有条件地格式化 SwiftUI 代码

如何删除桥头而不出错?

即使设置为从不也可以访问 iOS11 照片库

Swift 协议只能设置?

如何更改弹出框的大小

Type 应该采用什么协议来让泛型函数将任何数字类型作为 Swift 中的参数?

通过单击表格视图中的单元格打开新的视图控制器 - Swift iOS