我正在嘗試對 URLSessionDataTask 進行子類化,如這篇文章中所示Initializer does not override a designated initializer while subclassing NSURLSession Swift Except that the sub class init imposes a super.init back to parent class. 這是代碼:
class DataTaskFakeWrapper {
let DataTaskFakeWrapper: URLSessionDataTask
init(DataTaskFakeWrapper: URLSessionDataTask) {
self.DataTaskFakeWrapper = DataTaskFakeWrapper
}
}
class DataTaskFake: DataTaskFakeWrapper {
var completionHandler: ((Data, URLResponse, Error) -> Void)?
var data: Data
var urlResponse: URLResponse
var responseError: Error
init( data: Data, urlResponse: URLResponse, responseError: Error) {
self.data = data
self.urlResponse = urlResponse
self.responseError = responseError
super.init(DataTaskFakeWrapper:
URLSessionDataTask)
}
func resume() {
completionHandler?(data, urlResponse, responseError)
}
func cancel() {
// not applicable
}
}
出現訊息“無法將‘URLSessionDataTask.Type’型別的值轉換為預期的引數型別‘URLSessionDataTask’,我無法從我的子類中找到正確的通信型別:
super.init(DataTaskFakeWrapper:
URLSessionDataTask)
并避免該訊息:“無法將‘URLSessionDataTask.Type’型別的值轉換為預期的引數型別‘URLSessionDataTask’”
通過 URLSession 的類似子類化,super.int 允許 URLSession(configuration: .default) 引數。
在我的例子中,URLSessionDataTask 是什么。非常感謝
uj5u.com熱心網友回復:
- 在
DataTaskFakeWrapper類中,您的DataTaskFakeWrapper屬性應該以駝峰式大小寫形式輸入,dataTaskFakeWrapper以避免混淆型別本身 - 在
DataTaskFakesuper.init呼叫中你沒有初始化物件,只是試圖傳遞型別。現在應該是
let dataTask = URLSession.shared.dataTask(with: URLRequest(url: URL(string: "https://www.my-fake-url.com")))
super.init(
DataTaskFakeWrapper: DataTaskFakeWrapper(
DataTaskFakeWrapper: dataTask
)
)
這也向您展示了為什么最好使用駝峰命名法來命名屬性。
存根網路代碼也很好,這樣您的測驗就不會發出真正的網路請求(導致不穩定的結果)。您可以閱讀更多關于實施URLProtocol然后注冊您的“假服務器”的資訊URLProtocol.registerClass
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/533788.html
標籤:ios迅速子类化
