符合协议要求委托变量在 ios13 中可用

conforming to a protocol require delegate variable be available in ios13

有这个协议

 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}

}

现在编译器告诉

Protocol 'URLSessionWebSocketTaskProtocol' requires 'delegate' to be available in iOS 13.0.0 and newer

目标最低版本设置为iOS 13,所以应该有必要添加@available(iOS 13.0, *),但无论如何添加并没有改变编译器不断告诉协议要求委托在 iOS 13 中可用。 URLWebSocketTask 本身没有委托 属性 它继承自 URLSessionTask 具有 属性 类型的委托 [=] 29=]URLSessionTaskDelegate 和 URLWebSocketTaskDelegate 符合 URlSessionTaskDelegate.

所以我如何向协议添加委托并且一致性不显示该错误。

URLSessionWebSocketTask is-a NSURLSessionTask,自 iOS 15:

以来只有 delegate (!!)
@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

验证