соответствие протоколу требует, чтобы переменная делегата была доступна в 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}

}

теперь компилятор говорит, что

Протокол «URLSessionWebSocketTaskProtocol» требует, чтобы «делегат» был доступен в iOS 13.0.0 и новее.

целевая минимальная версия установлена ​​​​на iOS 13, поэтому необходимо добавить @ available (iOS 13.0, *), но добавлено в любом случае, и компиляторы продолжают сообщать, что протокол требует, чтобы делегат был доступен в iOS 13URLWebSocketTask не имеет свойства делегата как такового, он наследуется от URLSessionTask, у которого есть свойство делегата типа URLSessionTaskDelegate, а URLWebSocketTaskDelegate соответствует URlSessionTaskDelegate.

так как я мог добавить делегата в протокол, и соответствие не показывает эту ошибку.

1 ответ

В URLSessionWebSocketTaskэто NSURLSessionTask, который имеет 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

Другие вопросы по тегам