Leg*_*ess 2 inheritance initializer factory-method swift urlsession
我正在尝试URLSession在 Swift 中创建一个子类(原因无关紧要,但与测试有关)。我需要它与 adelegate和特定的 一起使用URLSessionConfiguration,这是 上的只读属性URLSession。URLSession使用委托进行初始化的通常方法是使用以下代码完成的,它可以完美地工作:
let session = URLSession(configuration: URLSessionConfiguration.default, delegate: nil, delegateQueue: nil)
Run Code Online (Sandbox Code Playgroud)
现在让我们创建一个子类:
class MyURLSession : URLSession {}
let session = MyURLSession(configuration:
URLSessionConfiguration.default, delegate: nil, delegateQueue: nil) // Compile error
Run Code Online (Sandbox Code Playgroud)
初始化程序触发下一个编译错误:
error: argument passed to call that takes no arguments
根据 Swift Language Guide rule 1 for Automatic Initializer Inheritance:
If your subclass doesn’t define any designated initializers, it
automatically inherits all of its superclass designated initializers.
Run Code Online (Sandbox Code Playgroud)
所以,技术上 MyURLSession应该继承所有指定的初始化器,但它没有,它只继承init()自NSObject. 查看以下文档URLSession:
public /*not inherited*/ init(configuration: URLSessionConfiguration)
public /*not inherited*/ init(configuration: URLSessionConfiguration, delegate: URLSessionDelegate?, delegateQueue queue: OperationQueue?)
Run Code Online (Sandbox Code Playgroud)
除了评论之外,没有什么可见的,它是 不是继承的。查看它的 Objective-C 定义,我们可以注意到它们不是初始化器,而是工厂方法,它们作为初始化导入到 Swift 中。
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration;
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(nullable id <NSURLSessionDelegate>)delegate delegateQueue:(nullable NSOperationQueue *)queue;
Run Code Online (Sandbox Code Playgroud)
所以问题是,如何在初始化时覆盖和/或正确调用超类的这些方法?
您不应该继承 URLSession。您无法访问要访问的初始化方法,并且 URLSessionConfiguration 和委托属性是只读的,因此您无法设置它们。
基本上没有办法用子类来做你想做的事。
如果你关心测试 URLSessions 那么也许看看这样的东西Mock Objects For Testing