符合协议要求委托变量在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}

}

现在编译器告诉

协议"URLSessionWebSocketSkyProtocol"要求"delegate"在iOS 13.0.0和更新的中可用

目标minimun版本设置为iOS 13,因此应该有必要添加@available(iOS 13.0,*(,但以任何方式添加,并且没有更改。编译器一直告诉我们,协议要求委托在iOS 13中可用。URLWebSocketTask本身没有委托属性,它继承自具有类型为URLSessionTaskDelegate的委托属性的URL会话任务,并且URLWebSocket-TaskDelegate符合URLSessionTaskDelegation。

所以我如何在协议中添加一个委托,而一致性并没有显示出这个错误。

URLSessionWebSocketTask是一个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 进行验证

最新更新