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