我尝试子类化一个URLSessionDataTask,如Initializer does not override a designated initializer while subclassing NSURLSession Swift所示,除了子类init将一个super.init强加给父类.
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(配置:.default)参数。
在我的例子中,URLSessionDataTask的值是什么?非常感谢
1条答案
按热度按时间v8wbuo2f1#
1.在
DataTaskFakeWrapper
类中,您的DataTaskFakeWrapper
属性应该以camel的形式键入,因此dataTaskFakeWrapper
避免与类型本身混淆1.在
DataTaskFake
super.init
调用中,您并没有初始化对象,只是尝试传递类型。这也向您展示了为什么最好使用camel大小写来命名属性。
最好还能将网络代码截短,这样您的测试就不会发出真实的的网络请求(导致不可靠的结果)。