首页 文章

在Swift中对URLSession的工厂方法进行子类化

提问于
浏览
1

我试图在Swift中创建 URLSession 的子类(原因无关紧要,但与测试有关) . 我需要它使用 delegate 和特定的 URLSessionConfiguration ,这是 URLSession 上的只读属性 . 使用委托初始化 URLSession 的常用方法是使用下面的代码完成的,它可以完美地运行:

let session = URLSession(configuration: URLSessionConfiguration.default, delegate: nil, delegateQueue: nil)

现在让我们创建一个子类:

class MyURLSession : URLSession {}

let session = MyURLSession(configuration: 
URLSessionConfiguration.default, delegate: nil, delegateQueue: nil) // Compile error

初始化程序触发下一个编译错误:

error: argument passed to call that takes no arguments

根据Swift Language Guide规则1为 Automatic Initializer Inheritance

If your subclass doesn’t define any designated initializers, it 
automatically inherits all of its superclass designated initializers.

因此,技术上 MyURLSession 应该继承所有指定的初始值设定项,但它不会,并且它只从 NSObject 继承 init() . 查看 URLSession 的文档:

public /*not inherited*/ init(configuration: URLSessionConfiguration)
public /*not inherited*/ init(configuration: URLSessionConfiguration, delegate: URLSessionDelegate?, delegateQueue queue: OperationQueue?)

除了评论之外没有任何其他内容可见,它是 not inherited . 查看它的Objective-C定义,我们可以注意到它们不是初始化器,而是工厂方法,它们作为inits导入到Swift中 .

+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration;
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(nullable id <NSURLSessionDelegate>)delegate delegateQueue:(nullable NSOperationQueue *)queue;

So the question is, how to override and/or correctly call these methods of superclass in initialization?

1 回答

  • 4

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

    基本上没有办法通过子类化做你想做的事 .

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

相关问题