具有此协议
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 进行验证