Swift 中 URLSession 的子类化工厂方法

Leg*_*ess 2 inheritance initializer factory-method swift urlsession

我正在尝试URLSession在 Swift 中创建一个子类(原因无关紧要,但与测试有关)。我需要它与 adelegate和特定的 一起使用URLSessionConfiguration,这是 上的只读属性URLSessionURLSession使用委托进行初始化的通常方法是使用以下代码完成的,它可以完美地工作:

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)

所以问题是,如何在初始化时覆盖和/或正确调用超类的这些方法?

Uph*_*uth 5

您不应该继承 URLSession。您无法访问要访问的初始化方法,并且 URLSessionConfiguration 和委托属性是只读的,因此您无法设置它们。

基本上没有办法用子类来做你想做的事。

如果你关心测试 URLSessions 那么也许看看这样的东西Mock Objects For Testing

  • 这就是我在回答中所说的。无法通过子类化来完成您想要做的事情,因为 URLSession 并不是设计来进行子类化的。如果这样做,您将无法访问子类的这些初始化程序,并且您将无法为子类设置会话配置或委托,因为它们是只读的。如果是出于测试目的,则采用模拟对象路线,否则您需要为 URLSession 或扩展创建包装器,而不是子类化。 (2认同)