tener este protocolo
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() }y conforme a ella en esta parte
extension URLSessionWebSocketTask: URLSessionWebSocketTaskProtocol {}funciona bien, pero necesito tener una propiedad de delegado en el protocolo, así que modifiqué el protocolo a este
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}}
ahora el compilador dice que
El protocolo 'URLSessionWebSocketTaskProtocol' requiere que 'delegate' esté disponible en iOS 13.0.0 y posteriores
la versión mínima de destino está establecida en iOS 13, por lo que debería ser necesario agregar el @disponible (iOS 13.0, *), pero se agregó de cualquier manera y no hay cambios, los compiladores siguen diciendo que el protocolo requiere que el delegado esté disponible en iOS 13 URLWebSocketTask no tiene una propiedad delegada per se, hereda de URLSessionTask que tiene una propiedad delegada de tipo URLSessionTaskDelegate y URLWebSocketTaskDelegate se ajusta a URlSessionTaskDelegate.
Entonces, ¿cómo podría agregar un delegado al protocolo y la conformidad no muestra ese error?
La URLSessionWebSocketTask es una NSURLSessionTask , que solo tiene delegate (!!) desde 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));entonces, si desea ajustarse a ese contrato API, debe hacer lo mismo en su protocolo, como:
public protocol URLSessionWebSocketTaskProtocol { // ... other methods here @available(iOS 15, *) // << here !! var delegate: URLSessionTaskDelegate? { get set } }por supuesto, la alternativa es hacer que la extensión se limite a iOS15+, como
@available(iOS 15, *) extension URLSessionWebSocketTask: URLSessionWebSocketTaskProtocol { }Verificado con Xcode 13.2.1