符合协议要求委托变量在 ios13 中可用
conforming to a protocol require delegate variable be available in 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}
}
现在编译器告诉
Protocol 'URLSessionWebSocketTaskProtocol' requires 'delegate' to be available in iOS 13.0.0 and newer
目标最低版本设置为iOS 13,所以应该有必要添加@available(iOS 13.0, *),但无论如何添加并没有改变编译器不断告诉协议要求委托在 iOS 13 中可用。
URLWebSocketTask 本身没有委托 属性 它继承自 URLSessionTask 具有 属性 类型的委托 [=] 29=]URLSessionTaskDelegate 和 URLWebSocketTaskDelegate 符合 URlSessionTaskDelegate.
所以我如何向协议添加委托并且一致性不显示该错误。
URLSessionWebSocketTask
is-a 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
验证
有这个协议
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}
}
现在编译器告诉
Protocol 'URLSessionWebSocketTaskProtocol' requires 'delegate' to be available in iOS 13.0.0 and newer
目标最低版本设置为iOS 13,所以应该有必要添加@available(iOS 13.0, *),但无论如何添加并没有改变编译器不断告诉协议要求委托在 iOS 13 中可用。 URLWebSocketTask 本身没有委托 属性 它继承自 URLSessionTask 具有 属性 类型的委托 [=] 29=]URLSessionTaskDelegate 和 URLWebSocketTaskDelegate 符合 URlSessionTaskDelegate.
所以我如何向协议添加委托并且一致性不显示该错误。
URLSessionWebSocketTask
is-a 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
验证