有這個協議
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 13 中可用. URLWebSocketTask本身沒有委托屬性,它從具有URLSessionTaskDelegate型別的委托屬性的URLSessionTask繼承,并且 URLWebSocketTaskDelegate 符合 URlSessionTaskDelegate。
所以我如何向協議添加一個委托并且一致性不會顯示該錯誤。
uj5u.com熱心網友回復:
URLSessionWebSocketTaskis-a ,自 iOS 15 以來只有 (!!) NSURLSessionTask: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 驗證
uj5u.com熱心網友回復:
您必須在類擴展中添加 var。這可能不相關,但誰知道呢?
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/441305.html
