ios Swift -子类化URLSessionDataTask -哪个超级.init(DataTaskFakeWrapper:URL会话数据任务?????????)是否应用?

4jb9z9bj  于 2022-11-19  发布在  iOS
关注(0)|答案(1)|浏览(84)

我尝试子类化一个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的值是什么?非常感谢

v8wbuo2f

v8wbuo2f1#

1.在DataTaskFakeWrapper类中,您的DataTaskFakeWrapper属性应该以camel的形式键入,因此dataTaskFakeWrapper避免与类型本身混淆
1.在DataTaskFakesuper.init调用中,您并没有初始化对象,只是尝试传递类型。

let dataTask = URLSession.shared.dataTask(with: URLRequest(url: URL(string: "https://www.my-fake-url.com")))
super.init(
  DataTaskFakeWrapper: DataTaskFakeWrapper(
    DataTaskFakeWrapper: dataTask
  )
)

这也向您展示了为什么最好使用camel大小写来命名属性。
最好还能将网络代码截短,这样您的测试就不会发出真实的的网络请求(导致不可靠的结果)。

相关问题